16

カウントダウンタイマーを備えたアプリケーションがあります。この方法でタイマーから呼び出される関数で更新されるラベルで作成しました。

...
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 は、整数 (秒数) を受け取り、mm:ss 形式の NSString を返す関数です。

つまり、時間はカウントダウンしますが、問題は、アプリケーションに UITableView があり、テーブルに触れて (セルに沿って移動するために) ドラッグすると、画面から指を離すまでタイマーが停止することです。 ...

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

4

4 に答える 4

31

を使用する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を参照してください。

于 2012-07-29T20:36:25.433 に答える
4

Swiftバージョンは次のとおりです。

スイフト2

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

スイフト 3、4、5

var timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(removeFromSuperview), userInfo: nil, repeats: false)
RunLoop.main.add(timer, forMode: RunLoop.Mode.common)
于 2015-08-20T12:06:11.487 に答える
0

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

于 2012-07-29T20:23:41.053 に答える