программно остановить анимацию uipickerview на iphone - PullRequest
7 голосов
/ 30 января 2011

У меня есть UIActionSheet, содержащий сборщик и UIToolbar.На UIToolBar есть кнопка сохранения.Тем не менее, некоторые из моих пользователей сообщили о нажатии кнопки сохранения до того, как UIPickerView перестанет вращаться, таким образом, получая только начальное значение (до вращения).

Есть ли способ получить выбранный в данный момент элемент UIPickerView, когда пользователь нажимаетсохранить или получить отзыв об активном выбранном элементе во время его вращения?

Спасибо

Ответы [ 7 ]

4 голосов
/ 17 июня 2011

Даже если они отклонят сборщик, пока он еще вращается, сборщик все равно вызовет делегата с последней выбранной строкой, как только он остановится, даже если он не виден. Предполагая, что вы еще не освободили его, вы можете настроить приемник делегата на проверку, является ли средство выбора видимым, и, если это не так, сохранить выбранное значение.

Я делаю это, предполагая, что ясно, что пользователь не прокручивает до случайного значения - обычно, когда они прокручивают и закрывают, не дожидаясь его завершения, это означает, что они прокручивались либо до самого верха, либо до самого низа списка. Я бы сказал, что вы можете смело использовать результат делегата в этих двух случаях.

2 голосов
/ 13 марта 2011

Вы когда-нибудь задумывались об использовании метода titleForRow, чтобы понять это?Поскольку прокручивается pickerview, вызывается ваш метод titleForRow для заполнения строк выше или ниже просматриваемой в данный момент строки (в зависимости от того, в каком направлении вращается средство выбора).Когда средство выбора останавливается, вызывается метод didSelectRow, и возвращается строка, содержащая 2 строки из последней строки, заполненной в методе titleForRow.

Я думаю, что вы могли бы выбрать остановку средства выбора в какой-то момент (таймеры для определения точки, которые используются для указания кода в titleForRow для захвата компонента и строки из вызова) в прокрутке, а затемselectRow для установки значения, которое вы хотите, чтобы оно было после того, как оно прекращает вращаться (и вызывается didSelectRow).

1 голос
/ 25 октября 2012

Только что найдено решение, которое работает для моего случая.Мне не нужно это последнее событие обновления, генерируемое, когда сборщик перестает вращаться после того, как пользователь отклонил его.Таким образом, этот метод останавливает прокрутку и не вызывает нового события выбора обновления.Похоже, после этого вы будете проверять, правильно ли выбран выбор в сборщике (мне все равно, я выбираю значения заново, когда показываю сборщик).

- (void)_resetPickerViewDelegates {
    id delegate = [_pickerView.delegate retain];
    id dataSource = [_pickerView.dataSource retain];

    _pickerView.delegate = nil;
    _pickerView.dataSource = nil;
    [_pickerView reloadAllComponents];
    _pickerView.delegate = delegate;
    _pickerView.dataSource = dataSource;

    [delegate release];
    [dataSource release];    
}
1 голос
/ 25 июня 2012

У меня была такая же проблема ... Я исправил это, просто добавив следующую строку кода в метод, который закрывает или выбирает значение выбора.

[_picker selectRow:[_picker selectedRowInComponent:0] inComponent:0 animated:YES];
1 голос
/ 31 января 2011

Я не думаю, что это проблема, которую вы сможете решить с помощью UIPickerView.

Сейчас нет способа определить, какая строка выбрана без остановки анимации (итаким образом, вид сборщика выбирает строку, на которой он остановился).Единственный способ - указать сборщику, на какой строке остановиться, используя selectRow:inComponent:animated:, но как вы узнаете, какая это строка?Вы не знаете, потому что сборщик вращается ...

Я думаю, что это всего лишь ограничение UIPickerView, и Apple, скорее всего, назвал бы его ожидаемым поведением.

0 голосов
/ 16 июня 2015

Это может быть "взлом", но это работает. Мой случай немного отличается. Я использую один UIPicker, но могу изменить какой объект это манипуляция.

Моя проблема заключалась в том, что вы могли выбрать один объект, вращать сборщик и, пока он заканчивает вращение, выбрать другой объект. В итоге получилось, что новый объект получил окончательное значение этого вращения, а не был проигнорирован.

Что я сделал, что при настройке UIPicker я бы дал ему уникальный tag на основе объекта, который он должен был обновить.

- (void)updatePickerView:(UIPickerView*)pickerView
{
    ...
    pickerView.tag = [self.myObject.position integerValue];
    [pickerView selectRow:i inComponent:0 animated:NO];
}

Затем, когда он заканчивает вращение, я проверяю, чтобы тег выровнялся по-прежнему.

    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
        if (pickerView.tag == [self.myObject.position integerValue]) {
            ...
        }
    }

Я не уверен, как он работает на стороне Apple, но этого было достаточно, чтобы заставить его работать на меня.

В качестве примечания, и я не уверен, имеет ли это значение, но мой UIPicker находится в UITableViewCell, но так как это многоразовая ячейка, и поскольку у меня были проблемы, которыми я был, я предполагаю UIPicker одинаков при перемещении из одной позиции в другую (поскольку на экране одновременно только одна).

0 голосов
/ 31 января 2011

При нажатии кнопки «Сохранить» Вы можете извлечь выбранный объект из вашего компонента с помощью

[component1Array objectAtIndex:[myPicker selectedRowInComponent:1]];

, где

  • «component1Array» - объект NSArray или NSMutableArrayкоторый используется для отображения объектов (необработанного содержимого) в вашем компоненте.
  • "myPicker" - это объект UIPickerView, который отображает средство выбора.
  • "[myPicker selectedRowInComponent: 1]" вернет текущий объектselected raw no из myPicker в компоненте «1».

И «[myPicker selectedRowInComponent: 2]» вернет текущее выбранное raw из myPicker в компоненте «2».Вы можете извлечь выбранный объект из вашего компонента2

 [component2Array objectAtIndex:[myPicker selectedRowInComponent:2]];

Надеюсь, он вам подходит.

...