Подтвердить что ты не робот

Цель 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];
}

Я попытался установить значение по умолчанию, которое не имело эффекта.

Любые идеи о том, что происходит?

Спасибо!

4b9b3361

Ответ 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 в режиме обратного отсчета). Но убедитесь, что вы установили это свойство в блок завершения после представления сборщика.