【问题标题】:How to stop timer when user goes back to previous view当用户返回上一个视图时如何停止计时器
【发布时间】:2012-02-13 09:18:12
【问题描述】:

我的计时器有问题。 在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 变量。

我该如何解决?

【问题讨论】:

    标签: iphone objective-c ios nstimer


    【解决方案1】:
        - (IBAction)backView:(id)sender {
          if ([sixtySecondTimer isValid])
    { 
          [sixtySecondTimer invalidate];
            timerInt = 0;
            [self.navigationController popViewControllerAnimated:YES];
        }
    

    向计时器发送invalidate 会阻止它再次触发

    【讨论】:

      【解决方案2】:

      您应该在转到前一个控制器之前使计时器无效,然后使用:

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

      【讨论】:

        【解决方案3】:

        如果您想在视图对您不可见时停止计时器,您应该将invalidateTimer 转换为viewDidDisappear 方法。如果您只想在该控制器超出层次结构时停止计时器,您应该将invalidateTimer 转换为dealloc 方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-18
          • 1970-01-01
          • 2011-04-23
          相关资源
          最近更新 更多