我有一个NSTimer和一个NSDate一起制作倒计时时钟。然后使用倒计时更新UILabel。
我面临的问题是倒计时时钟在模拟器中工作,但不在设备上。模拟器iOS 6.0和设备iOS 6.0.1。
这是我的代码:
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
[self startTimer];
}
// timer and update label to display a countdown clock
- (void)startTimer {
// Create a timer that fires every second repeatedly and save it in an ivar
NSTimer *timer = [[NSTimer alloc] init];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];
}
- (void)updateLabel {
// convert date string to date then set to a label
NSDateFormatter *dateStringParser = [[NSDateFormatter alloc] init];
[dateStringParser setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.000Z"];
NSDate *date = [dateStringParser dateFromString:deadlineDate];
NSLog(@"date from update label %@", date);
NSTimeInterval timeInterval = [date timeIntervalSinceNow]; ///< Assuming this is in the future for now.
NSString *stringVariable = [self stringFromTimeInterval:timeInterval];
self.deadlineLbl.text = [NSString stringWithFormat:@"%@", stringVariable];
NSLog(@"%@",stringVariable);
}
- (NSString *)stringFromTimeInterval:(NSTimeInterval)interval {
NSInteger ti = (NSInteger)interval;
// NSInteger seconds = ti % 60;
NSInteger minutes = (ti / 60) % 60;
NSInteger hours = (ti / 3600);
return [NSString stringWithFormat:@"%02i hours : %02i min", hours, minutes];
}
首先在模拟器上然后在设备上输出一些控制台输出:
模拟器控制台输出:
2012-11-14 15:39:57.021 appName[7856:13d03] 31 hours : 20 min
2012-11-14 15:39:58.020 appName[7856:13d03] 31 hours : 20 min
2012-11-14 15:39:59.021 appName[7856:13d03] 31 hours : 19 min
2012-11-14 15:40:00.021 appName[7856:13d03] 31 hours : 19 min
设备控制台输出:
2012-11-14 15:45:44.887 appName[7556:907] 00 hours : 00 min
2012-11-14 15:45:45.896 appName[7556:907] 00 hours : 00 min
2012-11-14 15:45:46.891 appName[7556:907] 00 hours : 00 min
2012-11-14 15:45:47.891 appName[7556:907] 00 hours : 00 min
我遇到的另一个问题是,在用户离开视图后,计时器会不断更新。
感谢您的帮助
答案 0 :(得分:1)
在行中检查日期变量:
NSDate *date = [dateStringParser dateFromString:deadlineDate];
检查调试器date
是否为零。如果是,则问题出现在deadlineDate
中,而dateStringParser
中未定义的预期格式(或deadlineDate
也为零)。
答案 1 :(得分:1)
在模拟器和硬件之间的不同行为方面,这些代码都不可疑。
如何初始化deadlineDate?尝试通过强制启动计时器中的值来将其排除为问题....
deadlineDate = [NSDate dateWithTimeIntervalSinceNow:3600];
您可以对代码进行一些其他改进(例如,不确定您在startTimer方法中使用labelFormatter做什么,可以删除这些行,保留日期格式化程序等),但没有任何改进解释模拟器与hw行为。