Цель C: UIDatePicker UIControlEventValueChanged только активируется при втором выборе
Работа с UIDatePickers в первый раз. Для начала я просто пытаюсь обновить текстовое поле любым значением, выбранным из datePicker (установленным в режиме обратного отсчета).
Он работает, но только второй раз, когда пользователь выбирает время. Мое действие, durationSelected() вызывается только во второй раз, поэтому нет проблем с обновлением textField.
Вот как я настроил сборщик дат в своем раскадровке:
![enter image description here]()
![enter image description here]()
Здесь действие запускается при изменении значения:
из DetailViewController.m
- (IBAction)durationSelected:(UIDatePicker *)sender
{
self.durationTextField.text = [NSString stringWithFormat:@"%f seconds", sender.countDownDuration];
}
Я попытался установить значение по умолчанию, которое не имело эффекта.
Любые идеи о том, что происходит?
Спасибо!
Ответы
Ответ 1
Кажется, это ошибка в реализации IOS 7 UIDatePicker. Я бы предложил подать на него радар.
Работа с SDK iOS 6 и работа на устройстве iOS 6 будет работать, а работа на устройстве iOS 7 не будет.
Вы можете исправить это, добавив эту строку кода в свой метод - (void)viewDidLoad
[self.datePicker setDate:[NSDate date] animated:YES];
Ответ 2
Я видел аналогичную ошибку с iOS 7.0.3 UIDatePicker, когда он используется в режиме UIDatePickerModeCountDownTimer. Сборщик не запускает целевое действие, связанное с событием UIControlEventValueChanged, с первым, когда пользователь меняет значение, прокручивая колеса. Он отлично работает для последующих изменений.
Ниже приведено эффективное решение. Просто приложите код, который устанавливает начальное значение countDownDuration в блоке отправки в основной цикл. Ваш метод целевого действия будет срабатывать каждый раз, когда колеса будут повернуты до нового значения. Этот подход практически не накладные расходы и работает достаточно хорошо на iPhone 4 и IPad 4.
dispatch_async(dispatch_get_main_queue(), ^{
self.myDatePicker.countDownDuration = (NSTimeInterval) aNewDuration ;
});
Ответ 3
Я не уверен, это образованное предположение:
Возможно, iOS отслеживает изменения значений для Date Picker только тогда, когда они вызваны анимацией колеса. Поэтому он устанавливает значение в вашем первом "рулоне", но только определяет, что изменилось на втором.
Как я уже сказал, я не могу быть уверен в причине, но исправление должно быть простым: просто установите дату просмотра программно после загрузки вида с помощью setDate: animated:
:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.picker setDate:[NSDate dateWithTimeIntervalSinceNow:0] animated:true ];
}
Кажется, он работает для меня.
Ответ 4
Вы можете попробовать установить значение countDownTimer (если вы используете datePicker в режиме обратного отсчета). Но убедитесь, что вы установили это свойство в блок завершения после представления сборщика.