UIDatePicker限制小时,但没有日期

时间:2021-04-06 16:06:04

I came across a situation where I needed to restrict a UIDatePicker's selected hour, but still allow free selection of the day. This would be useful if you wanted to allow a user to select a date/time during set business hours. I found something that was close to what I was wanting to do by alerting the user that their selection was bad, but didn't actually change the date on the picker, so I wanted to share my solution Q&A-style.

我遇到了一个情况,我需要限制一个UIDatePicker的选定时间,但仍然允许*选择的一天。如果您希望允许用户在设置的业务时间内选择日期/时间,这将非常有用。我发现了一些类似于我想要做的事情,通过通知用户他们的选择是错误的,但是实际上并没有更改选择器上的日期,所以我想分享我的解决方案q&a样式。

4 个解决方案

#1


4  

This particular example will not allow selection of times before 7:00am or after 9:59pm. Selection of an "invalid" time will immediately slide the UIDatePicker back to the closest valid time on the respective end of the spectrum (for example, selection of 10:02pm will immediately slide back to 9:59pm)

这个例子不允许在早上7点之前或晚上9点59分之后选择时间。选择一个“无效”时间将会立即将UIDatePicker滑回光谱各自端最近的有效时间(例如,选择10:02pm将立即滑回9:59pm)

- (void)datePickerChanged
{
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:datePicker.date];

    if([components hour] < 7)
    {
        [components setHour:7];
        [components setMinute:0];
        [datePicker setDate:[[NSCalendar currentCalendar] dateFromComponents:components]];
    }
    else if([components hour] > 21)
    {
        [components setHour:21];
        [components setMinute:59];
        [datePicker setDate:[[NSCalendar currentCalendar] dateFromComponents:components]];
    }
}

Edit: As @DuncanC suggested in the comments, feedback to the user should probably be included, such as a label saying "Only times between 7:00am and 9:59pm can be used"

编辑:正如@DuncanC在评论中建议的,可能应该包括对用户的反馈,比如一个标签,上面写着“只能在早上7点到晚上9点59分之间使用”

#2


2  

In Swift2.0:

在Swift2.0:

func datePickerChanged() {
    let components = NSCalendar.currentCalendar().components(
        [NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day, NSCalendarUnit.WeekOfYear, NSCalendarUnit.Hour, NSCalendarUnit.Minute, NSCalendarUnit.Second, NSCalendarUnit.Weekday, NSCalendarUnit.WeekdayOrdinal, NSCalendarUnit.WeekOfYear],
        fromDate: datePickerInstance.date)

    if components.hour < 7 {
        components.hour = 7
        components.minute = 0
        datePickerInstance.setDate(NSCalendar.currentCalendar().dateFromComponents(components)!, animated: true)
    }
    else if components.hour > 21 {
        components.hour = 21
        components.minute = 59
        datePickerInstance.setDate(NSCalendar.currentCalendar().dateFromComponents(components)!, animated: true)
    }
    else {
        print("Everything is good.")
    }
}

#3


1  

If you want to actually limit the hours that are displayed, I built a custom picker for that purpose. It's a subclass of UIPickerView and it replicates the functionality of UIDatePicker in countDownTimer mode, while adding support to set maxTimeInterval.

如果您想要限制显示的时间,我为此构建了一个自定义选择器。它是UIPickerView的一个子类,它在countDownTimer模式中复制UIDatePicker的功能,同时添加支持来设置maxTimeInterval。

UIDatePicker限制小时,但没有日期

You use it like this:

你可以这样使用它:

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

Available on GitHub under MIT license. Blog post here.

可在GitHub上获得麻省理工学院的许可。博客在这里。

#4


0  

In Swift 4:

在斯威夫特4:

func datePickerChanged() {
    var components = Calendar.current.dateComponents([.hour, .minute, .month, .year, .day], from: datePicker.date)

    if components.hour! < 7 {
        components.hour = 7
        components.minute = 0
        datePicker.setDate(Calendar.current.date(from: components)!, animated: true)
    }
    else if components.hour! > 21 {
        components.hour = 21
        components.minute = 59
        datePicker.setDate(Calendar.current.date(from: components)!, animated: true)
    }
    else {
        print("Everything is fine!")
    }
}

#1


4  

This particular example will not allow selection of times before 7:00am or after 9:59pm. Selection of an "invalid" time will immediately slide the UIDatePicker back to the closest valid time on the respective end of the spectrum (for example, selection of 10:02pm will immediately slide back to 9:59pm)

这个例子不允许在早上7点之前或晚上9点59分之后选择时间。选择一个“无效”时间将会立即将UIDatePicker滑回光谱各自端最近的有效时间(例如,选择10:02pm将立即滑回9:59pm)

- (void)datePickerChanged
{
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:datePicker.date];

    if([components hour] < 7)
    {
        [components setHour:7];
        [components setMinute:0];
        [datePicker setDate:[[NSCalendar currentCalendar] dateFromComponents:components]];
    }
    else if([components hour] > 21)
    {
        [components setHour:21];
        [components setMinute:59];
        [datePicker setDate:[[NSCalendar currentCalendar] dateFromComponents:components]];
    }
}

Edit: As @DuncanC suggested in the comments, feedback to the user should probably be included, such as a label saying "Only times between 7:00am and 9:59pm can be used"

编辑:正如@DuncanC在评论中建议的,可能应该包括对用户的反馈,比如一个标签,上面写着“只能在早上7点到晚上9点59分之间使用”

#2


2  

In Swift2.0:

在Swift2.0:

func datePickerChanged() {
    let components = NSCalendar.currentCalendar().components(
        [NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day, NSCalendarUnit.WeekOfYear, NSCalendarUnit.Hour, NSCalendarUnit.Minute, NSCalendarUnit.Second, NSCalendarUnit.Weekday, NSCalendarUnit.WeekdayOrdinal, NSCalendarUnit.WeekOfYear],
        fromDate: datePickerInstance.date)

    if components.hour < 7 {
        components.hour = 7
        components.minute = 0
        datePickerInstance.setDate(NSCalendar.currentCalendar().dateFromComponents(components)!, animated: true)
    }
    else if components.hour > 21 {
        components.hour = 21
        components.minute = 59
        datePickerInstance.setDate(NSCalendar.currentCalendar().dateFromComponents(components)!, animated: true)
    }
    else {
        print("Everything is good.")
    }
}

#3


1  

If you want to actually limit the hours that are displayed, I built a custom picker for that purpose. It's a subclass of UIPickerView and it replicates the functionality of UIDatePicker in countDownTimer mode, while adding support to set maxTimeInterval.

如果您想要限制显示的时间,我为此构建了一个自定义选择器。它是UIPickerView的一个子类,它在countDownTimer模式中复制UIDatePicker的功能,同时添加支持来设置maxTimeInterval。

UIDatePicker限制小时,但没有日期

You use it like this:

你可以这样使用它:

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

Available on GitHub under MIT license. Blog post here.

可在GitHub上获得麻省理工学院的许可。博客在这里。

#4


0  

In Swift 4:

在斯威夫特4:

func datePickerChanged() {
    var components = Calendar.current.dateComponents([.hour, .minute, .month, .year, .day], from: datePicker.date)

    if components.hour! < 7 {
        components.hour = 7
        components.minute = 0
        datePicker.setDate(Calendar.current.date(from: components)!, animated: true)
    }
    else if components.hour! > 21 {
        components.hour = 21
        components.minute = 59
        datePicker.setDate(Calendar.current.date(from: components)!, animated: true)
    }
    else {
        print("Everything is fine!")
    }
}