0

我有如下倒计时计时器:

- (void)updateCounterLabel:(NSTimer *)theTimer {
    if(secondsLeft > 0 ){

    secondsLeft -- ;
    hours = secondsLeft / 3600;
    minutes = (secondsLeft % 3600) / 60;
    seconds = (secondsLeft %3600) % 60;

    countDownLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds];

}
else{
    secondsLeft = timeInterval;
}

-(void)countdownTimer   {
    if([timer isValid]){
        [timer invalidate];
        timer = nil;
    }       
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounterLabel:) userInfo:nil repeats:YES];
}

----我的问题是,每次调用这个计时器时,它都会像这样递增: secondLeft-3 , secondLeft -5 ,secondLeft - 7 .....

每次我的视图加载时,我都会创建一个新的计时器,但旧的计时器仍然存在。在我的计时器的操作方法中,我正在减少一个跟踪秒数的索引变量,并且每个计时器每次触发时都会运行该方法。因此,如果我有三个计时器,则索引每次都会递减三个。

例如:

第一次加载:60、59、58...

第二次加载:60、58、56...

第三次加载:60、57、54...

问题:如果没有上述问题,我如何重新启动或重新创建计时器?请有人帮帮我。

4

1 回答 1

1

timer = [NSTimer scheduledTimerWithTimeInterval:...];

call在定时器运行时保留目标(视图控制器),因此视图控制器永远不会被释放,并且即使视图控制器从导航堆栈中弹出或关闭,定时器也会继续运行。

因此,如果再次加载视图,您将有两个视图控制器实例,因此有两个计时器,它们都递减相同的全局变量secondsLeft

这有望解释为什么该值每秒递减 2。

作为解决方案,您可以在 中创建计时器viewWillAppear,并在 中使其无效viewWillDisappear

于 2013-07-13T13:17:55.793 回答