pickers example ios objective-c uidatepicker

ios - example - Objetivo C: UIDatePicker UIControlEventValueChanged solo se activa en la segunda selección



uidatepicker swift 3 example (6)

El siguiente código después de presentar el selector me funcionó en Xcode 9.4 beta, iOS 11.4.

picker.countDownDuration = 0 picker.countDownDuration = 3600 // 1 Hour

Trabajando con UIDatePickers por primera vez. Para empezar, solo trato de actualizar un campo de texto con el valor seleccionado en el selector de fecha (establecido en el modo de cuenta atrás).

Funciona, pero solo la segunda vez que un usuario selecciona una hora. Mi acción, durationSelected () solo se llama la segunda vez, por lo que no hay problemas para actualizar el campo de texto.

Así es como configuré el selector de fecha en mi guión gráfico:

Aquí está la acción activada en Value Changed:

de DetailViewController.m

- (IBAction)durationSelected:(UIDatePicker *)sender { self.durationTextField.text = [NSString stringWithFormat:@"%f seconds", sender.countDownDuration]; }

He intentado establecer un valor predeterminado, que no tuvo ningún efecto.

¿Alguna idea sobre lo que está pasando?

¡Gracias!


Esto parece ser un error en la implementación de iOS 7 de UIDatePicker. Yo sugeriría archivar un radar en él.

La construcción en el SDK de iOS 6 y la ejecución en un dispositivo iOS 6 funcionarán, mientras que la ejecución en un dispositivo iOS 7 no funcionará.

Puede corregirlo agregando esta línea de código a su método - (void)viewDidLoad

[self.datePicker setDate:[NSDate date] animated:YES];


He tenido éxito con lo siguiente en Xcode 10, iOS 12.0.1 usando Swift 4.0:

Usando las otras respuestas como guía, terminé haciendo que el delegado de UITextField respondiera a:

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { if let _ = textField.inputView as? UIDatePicker { //In my case I had more than one text field who''s delegate would fire this method //So I checked to see if the input view was a date picker before continuing //If you have only one "delegated" text field then there''s probably //no need for a check perform(#selector(setDatePicker), with: nil, afterDelay: 0) } return true } @objc func setDatePicker() { Thread.doBlockOnMainThread { self.theTimePicker.countDownDuration = 1000 //or whatever } }

donde Thread.doBlockOnMainThread(_) es:

extension Thread { class func doBlockOnMainThread(_ block: () -> Void) { if !Thread.isMainThread { DispatchQueue.main.sync(execute: { block() }) } else { block() } } }

Dejando de lado, descubrí que no es solo cuando el UIDatePicker aparece por primera vez, sino también cuando el usuario intenta por error establecer el valor de la cuenta regresiva en cero. El DatePicker se mueve automáticamente a 1 como se espera, pero luego el cambio de valor no disparará el objetivo requerido.


He visto un error similar con el UIDatePicker de iOS 7.0.3 cuando se usa en el modo UIDatePickerModeCountDownTimer. El selector no dispara la acción objetivo asociada con el evento UIControlEventValueChanged la primera vez que el usuario cambia el valor desplazando las ruedas. Funciona bien para los cambios posteriores.

A continuación se muestra una solución eficiente. Simplemente encierre el código que establece el valor inicial de countDownDuration en un bloque de envío al bucle principal. Su método de acción objetivo disparará cada vez que las ruedas giren a un nuevo valor. Este enfoque casi no tiene gastos generales y funciona bastante bien en un iPhone 4 y iPad 4.

dispatch_async(dispatch_get_main_queue(), ^{ self.myDatePicker.countDownDuration = (NSTimeInterval) aNewDuration ; });


No estoy seguro, es una conjetura educada:

Puede ser que iOS esté realizando un seguimiento de los cambios de valor para el Selector de fecha solo cuando son causados ​​por la animación de la rueda. Así que establece el valor en su primer "rollo", pero solo detecta que ha cambiado en el segundo.

Como dije, no puedo estar seguro de la razón, pero la solución debería ser simple: simplemente configure la fecha de inicio programáticamente después de que la vista se cargue con 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 ]; }

Parece estar funcionando para mí.


Puede intentar establecer el valor de countDownTimer (si está usando datePicker en el modo de cuenta regresiva). Pero asegúrese de establecer esta propiedad dentro del bloque de finalización después de presentar el selector.