UIPickerView selectedRowInComponent: возвращает устаревшие данные после того, как код их корректирует - PullRequest
7 голосов
/ 10 июля 2009

У меня есть UIPickerView с несколькими компонентами. Некоторые значения выделены серым цветом, и мой pickerView:didSelectRow:inComponent учитывает это, смещая рассматриваемый компонент средства выбора к ближайшему действительному значению, так же как UIDatePicker перемещается с «30» на «28», когда вы выбираете «Февраль». Затем он вызывает метод делегата для объявления скорректированного значения.

Когда мой метод настройки вызывает мои UIPickerView selectRow:inComponent:animated:YES, значение на экране правильное, но значения от selectedRowInComponent: устарели (до настройки серого). Однако, если я вызываю selectRow:inComponent:animated:NO, возвращаемые значения верны, но отсутствие анимации раздражает.

Я попытался обернуть корректировку в блок beginAnimations: / commitAnimations и перехватить значения в UIView +animationDidStopSelector, но я все еще получаю устаревшие значения. Кто-нибудь сталкивался с этим раньше?

Проблема легко дублируется.

[picker selectRow:newValue inComponent:i+offset animated:YES];

retValue = [picker selectedRowInComponent:i+offset];

Если у вас есть ДА, чтобы анимировать его, тогда retValue равно 0 (вы называете его устаревшим). При изменении значения NO значение retValue будет таким же, как и значение newValue.

1 Ответ

1 голос
/ 13 марта 2012

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

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

Как именно вы все-таки ловите конец анимации, не могли бы вы показать код, который вы использовали?

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

...