2016-11-22 12 views
-1

nstimerを使用して、ラベルにカウントダウンタイマーを表示しています。私は、タイマーを開始し、ラベル内のカウントダウンを表示することができますが、タイマーは毎秒を表示するのではなく、次の秒にジャンプします。カウントダウンタイマーが10秒に設定されている場合、カウントダウンタイマーラベルには9,7,5,3,1のみが表示されます。nstimerカウントダウンが期待通りに機能しない

以下は私のコードです。

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)

各ティックで変数を2回デクリメントします。簡単で理解しやすいコードでタイマーを実行する

-(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

私はこの条件を使用すると、私はタイマーを無効にする問題に直面しています。タイマーを無効にするコードを表示することによってあなたの答えを編集することができます。 – Madhu

+0

コードを振り返って、どのように動作するのかは、「0」ではなく「1」で発生します。私は私の答えを更新します。 – EvilGeniusJamie

-1

//甘いとシンプルな方法:

また、これはない0以下はこれを処理するためのより良い方法である、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]; 
} 

ありがとう

+0

これは、scheduledTimerの使用方法を示していますが、OPに問題が何であるか、そしてどのように役立つのかをOPに伝えません。 – Jelle

関連する問題