Как остановить таймер, когда пользователь возвращается к предыдущему виду - PullRequest
1 голос
/ 13 февраля 2012

У меня проблема с таймером. В моем представлении игры в 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.

Как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 13 февраля 2012

Вы должны сделать недействительным таймер, прежде чем переходить к предыдущему контроллеру, используйте это:

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

        [self.navigationController popViewControllerAnimated:YES];
}
1 голос
/ 13 февраля 2012

Если вы хотите остановить таймер, когда просмотр не виден вам, вы должны invalidateTimer в viewDidDisappear метод.Если вы хотите остановить таймер только тогда, когда этот контроллер находится вне иерархии, вы должны invalidateTimer в dealloc метод.

1 голос
/ 13 февраля 2012
    - (IBAction)backView:(id)sender {
      if ([sixtySecondTimer isValid])
{ 
      [sixtySecondTimer invalidate];
        timerInt = 0;
        [self.navigationController popViewControllerAnimated:YES];
    }

отправка invalidate таймеру останавливает его повторный запуск

...