0

からタイマーを呼び出していviewDidLoadます。タイマーがセレクターを初めて呼び出すとき、期待される結果は問題ありません。しかし、徐々に呼び出しが行われると、関数は何らかの形でセレクターによって複数回呼び出されます。NSLog出力数が増加していることを示すログを記録しました。以下のコードがあります。状況が明確になることを願っています。

-(void)viewDidLoad
{
    remainingTicks = 10;
    [self updateLabel];
    myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                       target:self
                       selector:@selector(handleTimerTick)
                       userInfo:nil
                       repeats:YES];
}

-(void)handleTimerTick
{
    remainingTicks--;
    [self updateLabel];
    if (remainingTicks <= 0) {
        [myTimer invalidate];
        myTimer = nil;
        UIButton *but = [[UIButton alloc] init];
        if (answerAt == 0) {
            [buttonA setBackgroundColor:[UIColor greenColor]];
        }
        else if (answerAt == 1) {
            [buttonB setBackgroundColor:[UIColor greenColor]];
        }
        else if (answerAt == 2) {
            [buttonC setBackgroundColor:[UIColor greenColor]];
        }
        else {
            [buttonD setBackgroundColor:[UIColor greenColor]];
        }

        [self performSelector:@selector(next:) withObject:but afterDelay:1.5 ];       
    }
}

-(void)updateLabel
{
    timerLabel.text = [[NSNumber numberWithUnsignedInt: remainingTicks] stringValue];
}
4

2 に答える 2

0

ViewDidLoadの存続期間中に複数回呼び出すことができますUIViewController(たとえば、メモリ警告が表示され、ビューが表示されていない場合、コントローラーはそれを解放し、次に必要になったときに再読み込みします)。この動作を適切に処理するには、次のいずれかを行う必要があります。

A)タイマーを作成する前にタイマーが存在するかどうかをテストします(例if (myTimer == nil) { /* initialize the timer */ }

また

B) メソッドのタイマーをクリアしますviewDidUnload。(タイマーが不可視のビューに関連するイベントを発生させたくない可能性が高いため、これはおそらくあなたが望むものに沿ったものです)。

于 2012-04-30T21:02:14.160 に答える