9

私はNSTimerを持っています

timer = [NSTimer scheduledTimerWithTimeInterval:1 
                                         target:self 
                                       selector:@selector(periodicTimer) 
                                       userInfo:nil 
                                        repeats:YES];

どちらがしますか

- (void)periodicTimer
{
    NSLog(@"Bang!");
    if (timerStart != nil)
        [timerLabel setText:[[NSDate date] timeDifference:timerStart]];        
}

問題は、テーブルビューをスクロールしている間 (または他のタスクを実行している間) に、ラベルが更新されず、さらに "Bang!" というメッセージが表示されることです。表示されないので、メソッドが呼び出されないと思いました。

私の質問は、ユーザーがアプリのインターフェイスをいじっているときでも、ラベルを定期的に更新する方法です。

4

2 に答える 2

27

UITrackingRunLoopModeにタイマーを追加して、スクロール中にタイマーも起動するようにする必要があります。

NSRunLoop *runloop = [NSRunLoop currentRunLoop];
NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(myTimerAction:) userInfo:nil repeats:YES];
[runloop addTimer:timer forMode:NSRunLoopCommonModes];
[runloop addTimer:timer forMode:UITrackingRunLoopMode];

差出人: https ://stackoverflow.com/a/1997018/474896

于 2012-05-26T11:58:19.353 に答える
-2

これについてはよくわかりませんが、インターフェイスを更新している間、インターフェイスがタイマーをレンダリングしているメインスレッドは何もする機会がないというのが私の最初の推測です。

タイマー用の新しい実行ループで新しいスレッドを作成することもできますが、それは少し見苦しい解決策かもしれません。アプリで達成しようとしている機能は何ですか? タイマーを使用するよりも優れた戦略をアドバイスできるかもしれません。

于 2012-05-26T10:02:30.823 に答える