在iOS日期选择器中设置最小和最大月份,但应更新选择器视图

时间:2016-11-17 21:23:27

标签: ios objective-c uitableview date uidatepicker

在视图中选择日期字段时,会显示日期选择器。我希望将滚动限制为比当前月份少至少2个月,最多比当前月份多4个月。我见过类似的例子。例如:对于当月11月,月份范围应为明年9月至3月。

我测试了this例子,但没有成功。

// Configure date picker
- (void) initializeDatePicker {
    _datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 600, 160)];
    _datePicker.backgroundColor = [UIColor whiteColor];
    _datePicker.datePickerMode = UIDatePickerModeDate;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setMonth:-2];
NSDate *minDate = [gregorian dateByAddingComponents:comps toDate:currentDate  options:0];
[comps setMonth:4];
NSDate *maxDate = [gregorian dateByAddingComponents:comps toDate:currentDate  options:0];

_datePicker.minimumDate = minDate;
_datePicker.maximumDate = maxDate;


[_datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
[_txfDateTextField setInputView:_datePicker];
selectedDate =[NSDate date];
}

更新 上面的代码更新了日期选择器对象。但是,问题是日期选择器视图没有变化。对于上面的例子,我希望滚动限制从9月到明年3月的滚动。这样,用户在滚动时不会被淹没。从更好的 UX 的角度来看。

1 个答案:

答案 0 :(得分:1)

好的,基于扩展的讨论,我现在明白,目标是删除超出范围的月份。

您无法使用标准日期选择器执行此操作。您必须使用UIPickerView构建自定义控件。

简短的回答是,"不要这样做。"

如果你想允许2个月前,4个月前进:

如果您当前的日期是2016年11月:

有效月份为2016年9月,10月,11月,2016年12月以及2017年1月,2月和3月。

因此,如果用户选择2016,则需要在9月,10月,11月填充月份选择器轮。然后,如果用户切换到2017,则您需要仅在1月,2月和3月重建月轮。

但是,现在您还没有使用日期选择器,您使用{strong} 的UIPickerView就像日期选择器一样。

因此,除了根据当前年度重建月份微调器之外,您还必须管理设置日期选择器以显示当前所选年份和月份的有效天数。大多数月份有30或31天,但二月呢?闰年怎么样?几个世纪,哪些不是闰年呢?

另外,您构建了一个看起来像日期选择器的控件,而那种,但并不完全像一个日期选择器。

你要去处理格里高利以外的日历吗?希伯来语,阿拉伯语,中国日历怎么样?你需要做的就是让所有这些工作正常。

Apple在可用性研究上投入了大量资金,并提出了一个运行良好的标准控件,并且可以处理不同日历系统等的本地化。

简而言之,这是一个你想要陷入其中的兔子洞。