2012-07-29 9 views
15

カウントダウンタイマー付きのアプリケーションがあります。私はこのようタイマーから呼び出された関数で更新されたラベルでそれを作った:UITableViewをドラッグしているときにNSTimerが機能しない

... 
int timeCount = 300; // Time in seconds 
... 
NSTimer *myTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(actualizarTiempo:) userInfo:nil repeats:YES]; 
... 
- (void)actualizaTiempo:(NSTimer *)timer { 
    timeCount -= 1; 
    if (timeCount <= 0) { 
     [timer invalidate]; 
    } else { 
     [labelTime setText:[self formatTime:timeCount]]; 
    } 
} 

注:FORMATTIMEは整数(秒数)を受信する機能をあり、フォーマットミリメートルでNSStringのを返します。 :ss

すべてが正常に動作しますが、時間はカウントダウンされますが、アプリケーションにUITableViewがあり、テーブルに触れてドラッグして(セルに沿って移動する)タイマーが停止するまで画面から指を離してください...

この動作は正常ですか?そうであれば、それを避けてテーブルをドラッグしながらタイマーを動作させる方法はありますか?

答えて

25

scheduledTimerWithTimeInterval:を使用すると、j.tom.schroederによれば、タイマーはデフォルトモードのメイン実行ループで自動的にスケジュールされます。これにより、実行ループが非デフォルトモード(タップまたはスワイプなど)のときにタイマーが起動しなくなります。

ソリューションは、しかし、スレッドを使用しますが、すべての一般的なモードのためのあなたのタイマーをスケジュールされていません。

NSTimer *timer = [NSTimer timerWithTimeInterval:1 
             target:self 
             selector:@selector(actualizarTiempo:) 
             userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

あなたは彼らがあなたのタイマーを停止することなくできるようにしたいイベントの種類に応じて、あなたは可能性がありますまた、UITrackingRunLoopModeと考えてください。実行ループモードの詳細については、Apple Docsを参照してください。相続人

+0

ありがとうございました、このソリューションで動作します。私はループモードを詳しく見て、私のイベントによく合ったものを手に入れようとします – rai212

+1

'' [timer invalidate]; '' viewWillDisappear'や他の方法では忘れないでください。 。 – skornos

0

これは正常な動作です。 scheduledTimerWithTimeInterval:のスケジュールは現在の実行ループ上にあるため、UITableViewとのやりとりは、actualizarTiempo:メソッドの呼び出しをブロックします。別のスレッドでactualizarTiempo:を実行するには、NSThreadメソッドdetachNewThreadSelector:toTarget:withObjectsleepForTimeIntervalを使用します。

+0

本当に問題がタイマは、現在の実行ループに関連していたという事実に関連していました。異なるループモードでNSRunLoopを使用すると、問題が解決されます。ありがとうございました – rai212

3

スウィフトバージョン:

var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "removeFromSuperview", userInfo: nil, repeats: false) 
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 
+0

Swift 3以上のバージョン:RunLoop.main.add(timer、forMode:RunLoopMode.commonModes) –

関連する問題