UIDatePicker设置最大日期

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

在视图中加载:

NSDate *Date=[NSDate date]; [DatePickerForDate setMinimumDate:Date]; [DatePickerForDate setMaximumDate:[Date dateByAddingTimeInterval: 63072000]]; //time interval in seconds 

而这种方法:

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

第一部分工作(一个 63072000,有时工作,有时不工作。 顺便说一句63072000大概是2年。 有任何想法吗?

我尝试使用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 ; 

我找到:

  • 当您第一次尝试选择超出最小和最大范围的日期时,UIDatePicker将自动滚回“范围内”。
  • 如果您再次立即选择超出范围的日期,则选取器将不会向后滚动,允许您选择超出范围的日期。
  • 如果选择器的选定日期超出范围,则其date属性将返回范围内的最近日期。
  • 当您调用setDate:setDate:animated: ,如果您传递的日期与Picker的date属性返回的完全相同的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 ; } } 

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

这是 GitHub上的工作项目 。