问题是停止NSTimer,由于某种原因[计时器无效]只是不工作......
也许我的眼睛充满了肥皂,但是无法理解为什么计时器没有停在0,而是反向计数-1,-2,-3等等......((< / p>
我正在使用纪元号作为目的地日期。还有一件事 - 我的按钮“IBAction stop”与[Timer invalidate]工作正常 - 当我在模拟器计时器停止时按下它...
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
Timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];
}
- (IBAction) start {
Timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateLabel) userInfo:nil repeats:YES];
}
- (IBAction) stop {
[Timer invalidate];
Timer = nil;
}
-(void)updateLabel {
NSCalendar *calender = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
int units = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *components = [calender components:units fromDate:[NSDate date] toDate:destinationDate options:0];
[dateLabel setText:[NSString stringWithFormat:@"%d%c %d%c %d%c %d%c", [components day], 'd', [components hour], 'h', [components minute], 'm', [components second], 's']];
destinationDate = [NSDate dateWithTimeIntervalSince1970:1355299710];
if (!destinationDate) {
[Timer invalidate];
Timer = nil;
}
}
答案 0 :(得分:0)
正如Totumus指出的那样,您的if
语句条件!destinationDate
始终评估为false,因此您的updateLabel
方法永远不会使您的计时器无效。
你还有另一个错误:
您正在viewDidLoad
创建一个计时器,并在Timer
实例变量中存储对它的引用。
然后你在start
创建另一个计时器并在Timer
实例变量中存储对它的引用,覆盖你在{{{ 1}}而不会使旧计时器失效。
所以现在你有两个计时器在运行,但你没有对旧计时器的引用,所以你永远不会让它失效。
请注意,运行循环具有对计划(运行)计时器的强引用,因此即使您删除了对它的所有强引用,计时器也会继续运行。这就是viewDidLoad
消息存在的原因:告诉run循环删除它对计时器的强引用。