如何设置 UIDatePickerModeCountDownTimer 的最长时间?

How can I set the UIDatePickerModeCountDownTimer's maximum time?

请问如何设置iOS倒计时的最长时间? (例如最多 1 小时 30 分钟)

倒数计时器是从UIDatePicker的模式中获取的:

谢谢!

编辑:

有人说我必须设置 minimum/maximum 日期,我只是在情节提要中设置了它们,但我看不出有什么区别:

(设置的时间是我当地时间+- 30分钟)

编辑:

来自苹果:

在倒数计时器模式 (UIDatePickerModeCountDownTimer) 中也忽略最小和最大日期。

那么他们到底要这样做吗?

对于 UIDatePickerModeCountDownTimer,您可以通过编程方式处理它

添加一个在 UIDatePicker 的值发生变化时调用的事件。

Objective-C

[self.datePicker addTarget:self action:@selector(datePickedValueChanged:)
     forControlEvents:UIControlEventValueChanged];

Swift

self.datePicker.addTarget(self, action: Selector("datePickedValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)

然后,如果值 selected 超出了允许的 selection,您可以将 DatePicker 设置为最大允许值(或任何您想要的值)

Objective-C

- (void)datePickedValueChanged:(id)sender{
    if (self.datePicker.countDownDuration > 5400.0f) { //5400 seconds = 1h30min
        [self.datePicker setCountDownDuration: 60.0f]; //Defaults to 1 minute
    }
}

Swift

func datePickedValueChanged (sender: UIDatePicker) {
    if (self.datePicker.countDownDuration > 5400) { //5400 seconds = 1h30min
        self.datePicker.countDownDuration = 60.0; //Defaults to 1 minute
    }
}

-- 之前的回答:

我在日期或日期和时间模式下使用 UIDatePicker 将之前的答案留给其他人,如果这可以帮助某些人

您可以设置 UIDatePicker 的最小和最大日期。

这里用户不能select现在时间之前的时间,只能提前1小时30分钟。

任何 select 另一个时间的尝试都会使 UIDatePicker 自动返回到允许的时间间隔。

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *currentDate = [NSDate date];

NSDateComponents *dateDelta = [[NSDateComponents alloc] init];
[dateDelta setDay:0];
[dateDelta setHour:1];
[dateDelta setMinute:30];
NSDate *maximumDate = [calendar dateByAddingComponents:dateDelta toDate:currentDate options:0];
[self.datePicker setMaximumDate:maximumDate];

[dateDelta setDay:0];
[dateDelta setHour:0];
[dateDelta setMinute:0];
NSDate *minimumDate = [calendar dateByAddingComponents:dateDelta toDate:currentDate options:0];

[self.datePicker setMinimumDate:minimumDate];

您可以使用 NSTimer 并设置间隔,然后更新 NSDatePicker

  1. 声明了一个全局变量int limiter = 0;和上一次的NSDate持有者;

  2. 将目标添加到您的 NSDatePicker


[self.YourDatePicker addTarget:self action:@selector(dateChanged:)forControlEvents:UIControlEventValueChanged];

设置间隔为60 == 1min

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(updateTime) userInfo:nil repeats:YES];

- (void) dateChanged:(UIDatePicker *)sender
{
    // handle date changes

     NSDate *set = sender.date; // time setted 

    // compute the difference base from this to `[NSDate timeIntervalSinceDate:]`

    NSDate *now = [NSDate date];

    // logic `limit = now - set (greater then the current time)`
}


- (void)updateTime
{
    NSLog(@"fired");

    limiter--; // 

    if (limiter == 0)
    {
        // TIME IS UP
        [timer invalidate];
        return;
    }

    NSDate *now = self.fourthProfileBirthdate.date;

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

    NSDateComponents *offsetComponents = [[NSDateComponents alloc] init];
    [offsetComponents setYear:-1]; // countdown subtracting  here from the current time

    // NSDate
    self.YourDatePicker.date = [gregorian dateByAddingComponents:offsetComponents toDate:now options:0];

}

抱歉,我无法继续详细介绍,我需要回家..

但希望这对您有所帮助..干杯!

虽然 Niko 的解决方案有效,但缺点是小时数仍然很大。如果您想实际限制显示的时间,我为此目的构建了一个自定义选择器。它是 UIPickerView 的子类,它在 countDownTimer 模式下复制了 UIDatePicker 的功能,同时添加了对设置 maxTimeInterval.

的支持

你这样使用它:

GSTimeIntervalPicker *picker = [[GSTimeIntervalPicker alloc] init];
picker.maxTimeInterval = (3600 * 3);    // set the limit
picker.minuteInterval = 5;              // the step. Default is 1 min.
picker.timeInterval = (3600 * 1.5);     // 1 h 30 minutes
picker.onTimeIntervalChanged = ^(NSTimeInterval newTimeInterval) {
    // Use the value
};

根据麻省理工学院许可,GitHub 可用。博客 post here.