Уменьшение таймера меняется для каждой загрузки страницы - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть таймер для моего проекта, каждый раз, когда он уменьшается на 1 секунду. Но если счетчик начинает работать во второй раз, он уменьшается на 2 секунды, а в третий раз - на 3 секунды и т.д.

-(void)viewDidAppear:(BOOL)animated { 

    count=15; //timer set as 15 seconds 
    [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounter:)userInfo:nil repeats:YES]; //for decrementing timer
}

- (void)updateCounter:(NSTimer *)theTimer { 
    count -= 1; 
    NSString *s = [[NSString alloc] initWithFormat:@"%d", count]; 
    if(count==0) // alert for time expiry 
    { 
       alert = [[UIAlertView alloc] initWithTitle:@"Time Out!!" message:@"Your time is expired." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
       [alert show]; 
       self.timer.hidden=YES; 
       [self dismissModalViewControllerAnimated:YES]; 
    } 

    else { 
      self.timer.text = s;
    } 

    [s release]; 
} 

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Из того, что вы опубликовали, вы создаете несколько таймеров и не останавливаете ни один из них.Таким образом, после 3 раз, у вас есть 3 таймера, запускающих каждую секунду.

Как минимум, когда таймер достигает нуля, вы хотите сделать его недействительным:Вы также можете подумать о том, чтобы удерживать созданный вами таймер (в @property), чтобы вы могли сделать его недействительным и отключить его, если пользователь покинет это представление каким-либо другим способом, прежде чем ваш счетчик фактически обнулится.это помогает.

0 голосов
/ 22 декабря 2011

EDIT
(Так же, как я опубликовал это, я заметил, что вы знаете, приняли вышеприведенный ответ и, похоже, удалили ваш комментарий «не работает» для ответа от @Firoze Lafeer. Но я оставлю это здесь в любом случае.)

Запуск приведенного ниже кода в качестве теста Я не понимаю вашу проблему. И даже когда я не сделал недействительной, я просто получил несколько выходов в журнале.

Вместо того, чтобы видеть, что происходит, смотрите на то, что делает текстовое поле в приложении. Попробуйте использовать протоколирование, как показано ниже, чтобы понять, дает ли это вам лучшее представление о происходящем.

-(IBAction)runTimer:(id)sender { // attached to a button
    [self invalidateTimer];
    count=15; //timer set as 15 seconds 
    //for decrementing timer
    countimer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                                                target:self
                                              selector:@selector(updateCounter:) 
                                              userInfo:nil
                                               repeats:YES];
}

-(void)updateCounter:(NSTimer *)theTimer { 
    count -= 1; 
    NSLog (@"count =@%d", count);          
    if(count==0) // alert for time expiry 
    { 
        [self invalidateTimer];
    }
}

-(void)invalidateTimer {
    if ([countimer isValid]) {
        [countimer invalidate];
        NSLog(@"countimer invalidated ");
        countimer = nil;
    }
}
...