программно остановить анимацию uipickerview на iphone

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

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

Спасибо


person zsniperx    schedule 30.01.2011    source источник
comment
что вы имеете в виду под спиннингом? Единственный известный мне вращающийся элемент пользовательского интерфейса iPhone — это UIActivityIndicatorView.   -  person Max    schedule 30.01.2011
comment
Я не пробовал, но что произойдет, если вы сделаете это во время вращения? [picker selectRow:[picker selectedRowInComponent:i] inComponent:i animated:YES]; для каждого компонента i, который у вас есть?   -  person nacho4d    schedule 30.01.2011
comment
@Max на iPhone, вы можете провести пальцем вниз по uipickerview, чтобы заставить его вращаться (стиль игрового автомата)   -  person zsniperx    schedule 30.01.2011
comment
@nacho4d... Я ответил то же самое... тебе следовало ответить, а не комментировать... это сэкономило бы время и другим..   -  person yunas    schedule 25.06.2012


Ответы (7)


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

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

person Shaun Budhram    schedule 16.06.2011
comment
Вы самый близкий ответ до сих пор! Казалось бы, верное решение. Однако мой сборщик находится в UIActionSheet, поэтому он будет выпущен после нажатия кнопки на панели инструментов в UIActionSheet, что, скорее всего, произойдет во время вращения, потому что строк не так много. Любые предложения о том, как обойти это или остановить его программно? Тем не менее проголосуй - person zsniperx; 18.06.2011
comment
Большое спасибо, Шон, немного корю себя за то, что не подумал об этом в первую очередь, но полностью помог мне!! Еще раз спасибо! - person crojassoto; 05.06.2014

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

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

person KevinS    schedule 13.03.2011

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

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

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

person Jasarien    schedule 31.01.2011
comment
Вы можете получить текущую строку, используя метод selectedRowInComponent для pickerView, даже если pickerView вращается. - person Ali Hamza; 20.06.2013

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

[_picker selectRow:[_picker selectedRowInComponent:0] inComponent:0 animated:YES];
person yunas    schedule 24.06.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];    
}
person MANIAK_dobrii    schedule 25.10.2012

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

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

где,

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

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

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

Надеюсь, это сработает для вас.

person Vipul Parmar    schedule 31.01.2011
comment
Проблема заключается в том, что при нажатии кнопки сохранения, если окно выбора все еще вращается, значит, выбранная строка еще не установлена. Это по-прежнему всегда будет возвращать ранее выбранную строку, а не ту строку, в которой появляется подсветка выбора, что не устраняет проблему. Проблема заключается в том, как принудительно указать представлению выбора выбрать строку, в которой он, по-видимому, находится во время вращения. Я не думаю, что вы можете. - person Jasarien; 31.01.2011

Это может быть "хак", но это работает. Мой случай немного другой. Я использую один 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 такой же, когда он перемещается из одной позиции в другую (поскольку на экране одновременно отображается только одна).

person RyanJM    schedule 15.06.2015