1

NSTimer毎秒ラベルを更新したいがあります。私のコードは次のとおりです。

- (IBAction)OnClickEmergencyButton:(id)sender
{
    emergencyAlertTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(emergencyTimer) userInfo:nil repeats:YES];
    [emergencyAlertTimer fire];
}

- (void)emergencyTimer
{
    int i = 0;
    _emergencyAlertTriggerTimerLabel.text = [NSString stringWithFormat:@"%d", ++i];
}

実行すると、ラベルは最初に「1」と表示され、その後停止しました。

「1」、「2」、「3」のように、ラベルを毎秒連続してカウントアップしたい...

4

5 に答える 5

5

タイマーに問題はありません。問題は、内の変数宣言にありemergencyTimer、ローカル変数として宣言しました。したがって、タイマーが起動するたびに、変数は再び 0 に初期化されます。したがって、変数を静的として宣言して、値を保持できるようにします。

メソッドを次のように変更します。

-(void)emergencyTimer
{
    static int timeValue = 0;
    _emergencyAlertTriggerTimerLabel.text = [NSString stringWithFormat:@"%d",++timeValue];
}

なぜ静的変数で、なぜインスタンス変数ではないのですか?

変数「スコープ」を安全に保つために、インスタンス変数は使用しませんでした。インスタンス変数にすれば同じクラスの他のメソッドからアクセスできるので、その機能が必要なければ静的変数の方がいいと思います。

于 2014-03-11T08:27:41.713 に答える
3

問題はこのコードにあります

int i=0;

タイマーメソッドが呼び出されるたびに、整数iが初期化され、ラベルは常に「1」として表示されます。

この変数を作成するglobalstatic、問題を解決してください。

于 2014-03-11T08:31:17.513 に答える
1

常にタイマーが呼び出されemergencyTimerますが、の値はiローカル変数であるため変更されず、スコープiは関数呼び出しの最後に残ります。グローバルに残る静的変数でこれを試してください...

-(void)emergencyTimer{
    static int i=0; // initialize at first time only..
    _emergencyAlertTriggerTimerLabel.text = [NSString stringWithFormat:@"%d",++i];
   if ( i == 100) 
       [ emergencyAlertTimer invalidate] // stop at certain condition
}
于 2014-03-11T08:29:27.017 に答える
0

まず、誰もが正しいので、現在何をしていても 0 しか表示されないので、インスタンス変数を使用します。

[NSTimer fire] の代わりに、一度だけ発火することに関しては、これを試してください:

emergencyAlertTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(emergencyTimer) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:emergencyAlertTimer forMode:NSRunLoopCommonModes];
于 2014-03-11T10:28:24.970 に答える