0

这是我的代码:

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分钟,所以我不希望picker返回不能被5整除的值,这样会导致我的程序崩溃。

这是一个错误吗?或者这只是我的问题?谢谢!

------致g检查员(对不起,我的英语不是很好)

因为 Datepicker 的 minuteInterval 是 5。所以 DatePicker 的日期的返回值只返回可以除以 5 的分钟(等等 0, 5 , 10 , 15 .....)

而且我将属性 minimumDate 设置为 [NSDate date],这样用户就无法选择过去的日期。

但是现在用户单击过去的行(灰色),DatePicker 的日期返回当时的时间。

所以日期的分钟可以是任何值(0~60),但不是我希望的(0、5、10、15....)

我已经尽力解释了>“<请原谅。


给督察 g。

感谢您的代码,我突然意识到有一种很好的方法可以解决我的问题。但我不知道为什么,如果我使用你的代码会有一些问题。(我想这是关于时区)

但是我按照你的逻辑,重新写了一段代码,分享给大家:

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

1 回答 1

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!
}
于 2012-04-08T16:20:52.410 回答