1

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

鉴于确实加载:

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

而这个方法:

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

第一部分有效(带有 <0 的部分),并返回到当前日期,但 > 63072000 的部分有时有效,有时无效。顺便说一句,63072000 大约是 2 年。有任何想法吗?

4

1 回答 1

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 ;

我找到:

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

考虑到这一点,您可以在 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 上的工作项目

于 2013-02-04T22:22:38.707 回答