如何在用户返回上一个视图时停止计时器

时间:2012-02-13 09:18:12

标签: iphone objective-c ios nstimer

我的计时器有问题。 在我viewDidLoad的游戏视图中,我有:

sixtySecondTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0/1.0) target:self selector:@selector(changeValue) userInfo:nil repeats:YES];

接下来我有changeValue方法:

- (void) changeValue {
    timerInt += 1;
    NSLog(@"TimerInt2 = %d", timerInt);
    NSString *string = [NSString stringWithFormat:@"%d", timerInt];
    labelTimer.text = string;
}

我使用以下方式转到上一个视图:

- (IBAction)backView:(id)sender {
    timerInt = 0;
    [self.navigationController popViewControllerAnimated:YES];
}

当我在命令行的上一个视图中时,我可以看到:

2012-02-13 10:04:33.393 Colores[1240:707] TimerInt2 = 1
2012-02-13 10:04:34.393 Colores[1240:707] TimerInt2 = 2
2012-02-13 10:04:35.393 Colores[1240:707] TimerInt2 = 3

当我在命令行中进入游戏视图时,我可以看到:

2012-02-13 10:04:36.393 Colores[1240:707] TimerInt2 = 4
2012-02-13 10:04:36.508 Colores[1240:707] TimerInt2 = 1
2012-02-13 10:04:37.393 Colores[1240:707] TimerInt2 = 5
2012-02-13 10:04:37.508 Colores[1240:707] TimerInt2 = 2
2012-02-13 10:04:38.393 Colores[1240:707] TimerInt2 = 6
2012-02-13 10:04:38.508 Colores[1240:707] TimerInt2 = 3

问题是我的计时器没有停止,当我再次进入游戏视图时创建“新”变量timerInt ...当我再次进入上一个视图并再次进入游戏视图时,我有三个timerInt变量。< / p>

我该如何解决?

3 个答案:

答案 0 :(得分:1)

    - (IBAction)backView:(id)sender {
      if ([sixtySecondTimer isValid])
{ 
      [sixtySecondTimer invalidate];
        timerInt = 0;
        [self.navigationController popViewControllerAnimated:YES];
    }

invalidate发送到计时器可以阻止它再次发射

答案 1 :(得分:1)

您应该在转到上一个控制器之前使计时器无效:

 - (IBAction)backView:(id)sender 
{
       if ([sixtySecondTimer isValid])
        {
           [sixtySecondTimer invalidate];
           sixtySecondTimer = nil;
       }
        timerInt = 0;

        [self.navigationController popViewControllerAnimated:YES];
}

答案 2 :(得分:1)

如果您想在查看不可见时停止计时器,则应invalidateTimer进入viewDidDisappear方法。如果您只想在控制器超出层次结构时停止计时器,则应invalidateTimer进入dealloc方法。