这是我的代码:
picker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0,40,0,0)];
picker.datePickerMode = UIDatePickerModeDateAndTime;
picker.minuteInterval = 5;
picker.minimumDate = [NSDate date];
好的,直到这里工作正常。 (图片:http://img29.imageshack.us/img29/8277/snap1r.png)
DatePicker中过去的天数都显示为灰色。它无法选择。 分钟间隔为5。
但现在当我点击任何已经变灰的行时。 DatePicker的日期返回此时的时间。
例如:我在DatePicker上抄了“9”(已经过去了) 系统时间现在是
22:27:57
和DatePicker的日期返回:(图片:http://img42.imageshack.us/img42/2760/nslog.png)
2012-04-08 22:27
因为我的分钟间隔是5分钟,所以我不希望选择器返回不能除以5的值,这将导致我的程序崩溃。
这是一个Bug吗?或者这只是我的问题? 谢谢!
------给督察g(抱歉我的英语不是很好)
因为Datepicker的minuteInterval是5.所以DatePicker日期的返回值只返回可以除以5的分数(等等0,5,10,15 ......)
并且我将属性minimumDate设置为[NSDate date],以便用户无法选择过去的日期。
但是现在用户点击过去的一行(变灰),DatePicker的日期返回当时的时间。
所以日期的分钟可以是任何值(0~60)但不是我希望的(0,5,10,15 ......)
我已尽力解释>“<请原谅。
To Inspector g。
感谢您的代码,我突然意识到有一个很好的方法来解决我的问题。 但我不知道为什么,如果我使用你的代码会有一些问题。 (我猜这是关于timeZone)
但我遵循你的逻辑并重新编写代码,我将与你分享:
unsigned unitFlags_ = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *comps_ = [gregorian components:unitFlags_ fromDate:[jRemindPicker date]];
NSInteger remainder = [comps_ minute] % 5;
NSLog(@"%i-%i-%i %i:%i", comps_.year, comps_.month, comps_.day, comps_.hour, comps_.minute);
if ( remainder ) {
/* My Own code /*
} else {
/* My Own Code /*
}
[gregorian release];
答案 0 :(得分:3)
您对选择日期/时间的问题的描述有点不清楚,所以也许您可以澄清一下?提供简短的截屏视频?
无论如何,听起来你今天之前无法选择日期,所以你的错误就在这一行:
picker.minimumDate = [NSDate date];
您将最小可选日期设置为当前日期和时间(就像[NSDate date]
返回的那样。
删除该行,您应该可以选择任何日期/时间。
修改强>
如果问题是您以后无法选择日期,请尝试设置:
picker.maximumDate = [NSDate distantFuture];
使用现有的最小值和新的最大值,可选日期的范围将设置在今天和非常之后的某个时间之后。
第二次编辑
谢谢你的澄清!我现在看到了问题。当您收到用户更改日期的回调时,您必须适当地向上或向下舍入。然后,您可以使用此时的舍入时间,或通过setDate: animated:
例如:
-(IBAction) pickerValueChanged:(id)selector_
{
UIDatePicker* picker = (UIDatePicker*) selector_;
// get the minutes from the picker
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:picker.date];
NSInteger minutes = [components minute];
// check if the minutes should be rounded
NSInteger remainder = minutes % 5;
if(remainder)
{
minutes += 5 - remainder;
[components setMinute:minutes];
picker.date = [calendar dateFromComponents:components];
}
// now picker.date is "safe" to use!
}