一个UIDatePicker错误?

时间:2012-04-08 15:57:03

标签: ios5 xcode4 uidatepicker

这是我的代码:

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];

1 个答案:

答案 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!
}