你用钳子来拧螺丝。该 seconds 一种方法 NSDateComponents 如果你在你所代表的时间看着秒针,你可以看到你在时钟上看到的东西 NSDate 。例如,当我键入它时,它是UTC 2011年3月26日星期六,02:52:04。如果我有 [NSDate date] 把它变成了一个 NSDateComponents 并问它 seconds ,我得到“4”。如果我在一秒钟内再次这样做,我会得到“5”,当分钟点击时,我会得到“59”,然后是“0”。
seconds
NSDateComponents
NSDate
[NSDate date]
你可以自己验证一下;把它放在你的计时器方法中:
NSInteger dcSecond = [dateComponents second]; NSLog(@"%d", dcSecond);
因此,每当实际时钟的分钟结束时,您计算剩余时间:
NSInteger seconds = time1 - [dateComponents second];
减去 0 从 time1 并回报你 time1 。这就是你遇到问题的原因。
0
time1
修复它的方法是转储日历和使用 CFAbsoluteTimeGetCurrent() 。首先,将开始时间放在计时器的userInfo中(如果您愿意,可以放在ivar中):
CFAbsoluteTimeGetCurrent()
[NSTimer scheduledTimer... // The function returns CFAbsoluteTime, which is a // typedef'd double but you're already working with // integers, so use a cast userInfo:[NSNumber numberWithInteger:(NSInteger)CFAbsoluteTimeGetCurrent()] ...];
然后更改剩余时间的计算(您调用的变量) seconds :
NSInteger startTime = [[timer userInfo] integerValue]; NSInteger currTime = (NSInteger)CFAbsoluteTimeGetCurrent(); NSInteger elapsedTime = currTime - startTime; NSInteger duration = time1 - startTime; //NSInteger seconds = time1 - [dateComponents second]; NSInteger remaining = duration - elapsedTime; int hour = remaining / 3600; ...
*: 好, 一 方式,但我认为可能是最好的。
您需要从进入下一行之前的总秒数中减去计算的小时数(不确定为什么使用模数)。像这样的东西(注意
int hour = (seconds / 3600 ); seconds -= hour * 3600; int minute = (seconds / 60 ); seconds -= minute * 60; int second = seconds;
希望能解决它。