example delegate birthdate objective-c ios xcode uidatepicker

objective-c - birthdate - uidatepicker delegate swift 4



UIDatePicker con intervalo de 15 m pero siempre el tiempo exacto como valor de retorno (3)

Tengo un UIDatePicker en modo Time con un intervalo de 15 minutos.

Digamos que es 7:22 PM. El valor que muestra el selector de fecha por defecto es la hora actual redondeada al siguiente valor más alto / más bajo, en este caso, son las 7:15 PM. Si el usuario interactúa con el selector de fecha, el valor que se muestra también es el valor devuelto. Sin embargo, si no ha habido ninguna interacción del usuario y obtengo la hora con [UIDatePicker date] el valor de retorno es la hora actual exacta, es decir, 7:22 para seguir con el ejemplo. ¿Hay alguna forma de obtener siempre el valor que realmente se muestra en el selector de fecha en lugar de la hora actual no redondeada, incluso si el usuario no ha elegido explícitamente un valor? Ya he intentado configurar el selector manualmente con [UIDatePicker setDate:[NSDate date]] pero eso no cambia el comportamiento.

¿Alguna pista? ¡Gracias por adelantado!


@ ima747 tiene razón si he cambiado el valor predeterminado del selector de fecha, entonces está funcionando bien y si he leído la fecha en el control del selector sin onChange , está devolviendo el valor de fecha incorrecto.
Pero he comprobado que, el control del selector de fecha ha establecido la fecha predeterminada (fecha actual y puede ser el uso de milisegundos de la hora más cercana). Si lo configuro en la fecha personalizada y también configuro la hora en cualquier fecha y 1: 00: AM así que ahora es mi hora el selector siempre se abre con 1: 00: AM en lugar de la hora actual


Esta no es una solución perfecta pero funciona para mí. Lo tomé de otra publicación y lo modifiqué para aceptar diferentes valores.

- (NSDate*)clampDate:(NSDate *)dt toMinutes:(int)minutes { int referenceTimeInterval = (int)[dt timeIntervalSinceReferenceDate]; int remainingSeconds = referenceTimeInterval % (minutes*60); int timeRoundedTo5Minutes = referenceTimeInterval - remainingSeconds; if(remainingSeconds>((minutes*60)/2)) {/// round up timeRoundedTo5Minutes = referenceTimeInterval +((minutes*60)-remainingSeconds); } return [NSDate dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)timeRoundedTo5Minutes]; }

Aliméntelo con una fecha de entrada y un valor de minuto (tomado de UIDatePicker.minuteInterval en el caso de este hilo) y devolverá un tiempo fijado a ese intervalo que puede enviar al selector.


He modificado la respuesta de @ ima747 para Swift 3/4 y como una extensión de UIDatePicker . picker.clampedDate

extension UIDatePicker { /// Returns the date that reflects the displayed date clamped to the `minuteInterval` of the picker. /// - note: Adapted from [ima747''s](http://.com/users/463183/ima747) answer on [](http://.com/questions/7504060/uidatepicker-with-15m-interval-but-always-exact-time-as-return-value/42263214#42263214}) public var clampedDate: Date { let referenceTimeInterval = self.date.timeIntervalSinceReferenceDate let remainingSeconds = referenceTimeInterval.truncatingRemainder(dividingBy: TimeInterval(minuteInterval*60)) let timeRoundedToInterval = referenceTimeInterval - remainingSeconds return Date(timeIntervalSinceReferenceDate: timeRoundedToInterval) } }