1
self.timerProgress=[NSTimer scheduledTimerWithTimeInterval:50.0 target:self selector:@selector(stopProgressView) userInfo:nil repeats:NO];

-(void)stopProgressView
{
    if ([self.timerProgress isValid]) {
        [self.timerProgress invalidate];
        self.timerProgress=nil;
    }  

}

NSTimerオブジェクトを無効にしようとしたときのボタンクリック

-(void)cancelTimer
{
       if ([self.timerProgress isValid]) {
            [self.timerProgress invalidate];
            self.timerProgress=nil;
        }   
}

無効になりません。50 の間隔の後に stopProgressView を 1 回呼び出します。この問題を解決するにはどうすればよいですか?

4

4 に答える 4

1

これの最も可能性の高い理由は、タイマーが、それを無効にしようとしたループとは別の実行ループでスケジュールされていることです。

タイマーは、スケジュールされている実行ループと同じスレッド/実行ループで無効にする必要があります。

Cocoa touch はスレッド セーフではないため、UI 関連のアクティビティはすべてメイン スレッドで実行する必要があります。異なるスレッドで GUI 作業を行う場合はうまくいくかもしれませんが、そうするとランダムにクラッシュし、このようなタイマーの問題も発生します。

于 2014-07-11T09:45:42.533 に答える
1
- (IBAction)stopTimer {
    if ([timerProgress isValid]) {
        [timerProgress invalidate];
    }
}

self.timerProgress使用しないでくださいtimerProgress

于 2013-03-05T06:28:57.983 に答える
0

このコードを後で追加するには、開始せずに作成NSTimerNSRunLoopますNSTimer

self.timerProgress = [NSTimer scheduledTimerWithTimeInterval:50.0 
                                                      target:self 
                                                    selector:@selector(stopProgressView) 
                                                    userInfo:nil
                                                     repeats:NO];

 //add  

[[NSRunLoop currentRunLoop] addTimer:_tapTimer 
                             forMode:NSDefaultRunLoopMode];
于 2013-03-05T06:58:57.283 に答える
0

あなたが投稿しているものから、それはうまくいくようです。これが私のアプリでの方法であり、正常に動作します。

ただし、次のようなタイマー オブジェクトを受け取るセレクターを作成してみてください。

-(void)stopProgressView:(NSTimer *)timer{
     //do stuff with timer here
}

これは、@selector(stopProgressView) を @selector(stopProgressView:) に変更する必要があることも意味することに注意してください。記録のために、私の現在の停止タイマー関数は [self.timer invalidate] を使用するだけで、正常に動作します。

デバッグに関する私のもう 1 つのアドバイスは、NSLogs を使用して、各メソッドが実際に呼び出されていることを確認し、メソッドが呼び出されたときに if 句内で NSLog が機能することを確認することです。

于 2013-03-05T06:34:07.533 に答える