UIDatePicker с интервалом 15 м, но всегда точное время в качестве возвращаемого значения - PullRequest
17 голосов
/ 21 сентября 2011

У меня есть UIDatePicker в режиме Time с интервалом в 15 минут.

Допустим, сейчас 19:22.Значение, которое средство выбора даты показывает по умолчанию, является текущим временем, округленным до следующего более высокого / более низкого значения, в данном случае это 7:15 PM.Если пользователь взаимодействует со средством выбора даты, показанное значение также является возвращаемым значением.Однако, если не было никакого взаимодействия с пользователем, и я получаю время с [UIDatePicker date], возвращаемое значение является точным текущим временем, то есть 7:22, чтобы придерживаться примера.Есть ли способ всегда получить значение, которое на самом деле отображается в средстве выбора даты, а не текущее необоснованное время, даже если пользователь явно не выбрал значение?Я уже пытался вручную установить селектор с помощью [UIDatePicker setDate:[NSDate date]], но это не меняет поведения.

Есть какие-нибудь подсказки?Заранее спасибо!

Ответы [ 3 ]

17 голосов
/ 16 февраля 2017

Я изменил ответ @ ima747 для Swift 3/4 и как расширение 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://stackoverflow.com/users/463183/ima747) answer on [Stack Overflow](/4256277/uidatepicker-s-intervalom-15-m-no-vsegda-tochnoe-vremya-v-kachestve-vozvraschaemogo-znacheniya})
    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)
    }
}
12 голосов
/ 27 января 2012

Это не идеальное решение, но оно работает для меня.Я взял его из другого поста и изменил его так, чтобы он принимал другие значения.

- (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];
}

Передайте ему дату ввода и значение минуты (взято из UIDatePicker.minuteInterval в случае этой темы)вернет время, ограниченное тем интервалом, который вы можете подать на сборщик.

0 голосов
/ 21 марта 2018

@ ima747 правильно, если я изменил значение по умолчанию для средства выбора даты, тогда он работает нормально, и если я прочитал дату из элемента управления средства выбора без onChange , тогда он возвращает неправильное значение даты.
Но я проверил, что элемент управления выбора даты установил дату по умолчанию (текущую дату и может быть, он использует ближайшие миллисекунды времени). Если я установлю его на пользовательскую дату, а также на любую дату и 1: 00: AM так что теперь мой сборщик времени всегда открыт с 1: 00: AM вместо текущего времени enter image description here

...