2016-11-22 2 views
-1

Я использую nstimer, чтобы показать таймер обратного отсчета в ярлыке. Я могу запустить таймер и показать отсчет в метке, но таймер переходит на следующую секунду, а не показывает каждую секунду. Если таймер обратного отсчета установлен на 10 секунд, он показывает только 9,7,5,3,1 на метке таймера обратного отсчета.nstimer count down не работает как ожидалось

Ниже приведен мой код.

NSTimer *tktTimer; 
int secondsLeft; 


- (void)startTimer { 
    secondsLeft = 10; 
     tktTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateCountdown) userInfo:nil repeats: YES]; 
} 

-(void) updateCountdown { 
    int hours, minutes, seconds; 

    secondsLeft--; 
    NSLog(@"secondsLeft %d",secondsLeft);//every time it is printing 9,7,5,3,1 but should print 9,8,7,6,5,4,3,2,1,0 
    hours = secondsLeft/3600; 
    minutes = (secondsLeft % 3600)/60; 
    seconds = (secondsLeft %3600) % 60; 
    countDownlabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds]; 


    if (--secondsLeft == 0) { 
     [tktTimer invalidate]; 
     countDownlabel.text = @"Completed"; 
    } 


} 

Любая помощь будет действительно оценена.

ответ

3

--secondsLeft обновляет переменную. Чтобы проверить, будет ли следующий декремент равным 0, используйте if (secondsLeft - 1 == 0)

Каждый тик уменьшает значение переменной в два раза.

Кроме того, это вызовет «Completed» текст на 1, а не 0. Ниже лучший способ справиться с этим:

-(void) updateCountdown { 
    int hours, minutes, seconds; 

    secondsLeft--; 
    if (secondsLeft == 0) { 
     [tktTimer invalidate]; 
     countDownlabel.text = @"Completed"; 
     return; 
    }   
    NSLog(@"secondsLeft %d",secondsLeft);//every time it is printing 9,7,5,3,1 but should print 9,8,7,6,5,4,3,2,1,0 
    hours = secondsLeft/3600; 
    minutes = (secondsLeft % 3600)/60; 
    seconds = (secondsLeft %3600) % 60; 
    countDownlabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds]; 
} 
+0

Если я использую это условие if, то я столкнулся с проблемами, чтобы аннулировать таймер. Можете ли вы отредактировать свой ответ, показывая код, чтобы аннулировать таймер. – Madhu

+0

оглядываясь на код и как он работает, это загорится на «1», а не на «0» - просто проверьте, будет ли это лучше. Я уточню свой ответ. – EvilGeniusJamie

-1

// сладкий и простой способ выполнить таймер с простым и понятным кодом

DECLARE

int seconds; 
NSTimer *timer; 

// в методе viewDidLoad

seconds=12; 
    timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(GameOver) userInfo:nil repeats:YES ]; 

-(void)GameOver 
{ 
    seconds-=1; 
    lblUpTimer.text=[NSString stringWithFormat:@"%d",seconds];//shows counter in label 

if(seconds==0) 
[timer invalidate]; 
} 

THANK YOU

+0

Хотя это показывает, как использовать schedTimer, он не говорит OP, что проблема и как это помогает ему/ей. – Jelle

Смежные вопросы