UIDatePicker设置最大日期

use*_*474 1 xcode ios

我正在使用此代码阻止用户超过我设置的限制:

在视图中加载:

NSDate *Date=[NSDate date];
[DatePickerForDate setMinimumDate:Date];
[DatePickerForDate setMaximumDate:[Date dateByAddingTimeInterval: 63072000]]; //time interval in seconds
Run Code Online (Sandbox Code Playgroud)

而这种方法:

- (IBAction)datePickerChanged:(id)sender{
if ( [DatePickerForDate.date timeIntervalSinceNow ] < 0 ){
    NSDate *Date=[NSDate date];
    DatePickerForDate.date = Date;
}

if ( [DatePickerForDate.date timeIntervalSinceNow ] > 63072000){
    NSDate *Date=[NSDate date];
    DatePickerForDate.date = Date;
}
}
Run Code Online (Sandbox Code Playgroud)

第一部分工作(一个<0),并返回当前日期,但一个> 63072000,有时工作,有时不工作.顺便说一句63072000约为2年.有任何想法吗?

Joh*_*uer 11

我尝试使用UIDatePicker,最大日期为一个月:

NSDate* now = [NSDate date] ;
// Get current NSDate without seconds & milliseconds, so that I can better compare the chosen date to the minimum & maximum dates.
NSCalendar* calendar = [NSCalendar currentCalendar] ;
NSDateComponents* nowWithoutSecondsComponents = [calendar components:(NSEraCalendarUnit|NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit) fromDate:now] ;
NSDate* nowWithoutSeconds = [calendar dateFromComponents:nowWithoutSecondsComponents] ;
//  UIDatePicker* picker ;
picker.minimumDate = nowWithoutSeconds ;

NSDateComponents* addOneMonthComponents = [NSDateComponents new] ;
addOneMonthComponents.month = 1 ;
NSDate* oneMonthFromNowWithoutSeconds = [calendar dateByAddingComponents:addOneMonthComponents toDate:nowWithoutSeconds options:0] ;
picker.maximumDate = oneMonthFromNowWithoutSeconds ;
Run Code Online (Sandbox Code Playgroud)

我找到:

  • 第一次尝试选择超出最小和最大范围的日期时,UIDatePicker将自动滚回"范围内".
  • 如果您再次立即选择超出范围的日期,则选择器将不会向后滚动,允许您选择超出范围的日期.
  • 如果选择器的选定日期超出范围,其date属性将返回最近的范围内的日期.
  • 当您致电setDate:或者setDate:animated:,如果您传递的日期与Picker date属性返回的完全相同的日期,Picker将不会执行任何操作.

考虑到这一点,这里有一个方法,您可以在Picker的值更改时调用,以防止您选择超出范围的日期:

- (IBAction) datePickerChanged:(id)sender {
    // When `setDate:` is called, if the passed date argument exactly matches the Picker's date property's value, the Picker will do nothing. So, offset the passed date argument by one second, ensuring the Picker scrolls every time.
    NSDate* oneSecondAfterPickersDate = [picker.date dateByAddingTimeInterval:1] ;
    if ( [picker.date compare:picker.minimumDate] == NSOrderedSame ) {
        NSLog(@"date is at or below the minimum") ;
        picker.date = oneSecondAfterPickersDate ;
    }
    else if ( [picker.date compare:picker.maximumDate] == NSOrderedSame ) {
        NSLog(@"date is at or above the maximum") ;
        picker.date = oneSecondAfterPickersDate ;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面ifelse if部分几乎相同,但我将它们分开,以便我可以看到不同的NSLog,并且还可以更好地调试.

这是 GitHub上的工作项目.