0

これが簡単な修正になることを願っています、あなたは私に言います。

私が持っているのは、NSTimerタイプのクラスIVAR*timerです。IBActionが実行されると、次のコードを含むメソッドが呼び出されます。

if (timer) timer = nil;
timer = [NSTimer timerWithTimeInterval:0.2 target:self selector:@selector(removeOverlay) userInfo:nil repeats:NO];

同じクラスに、次のメソッドがあります。

- (void)removeOverlay {
...
}

これは、0.2秒の時間間隔の後で発生しません。

ここで何が問題なのか知っていますか?

4

4 に答える 4

2
  1. その間timer、のインスタンスが解放されていないことを確認してください。NSTimer
  2. removeOverlay一部のUIが更新されているようです。メインスレッドで呼んでください。
  3. メソッドにブレークポイントを設定して、removeLayout起動するかどうかを確認します。
  4. タイマーをスケジュールしていません。に置き換えtimerWithTimeIntervalますscheduledTimerWithTimeInterval

メインスレッドでコードを実行するには(UIの更新を許可します):

- (void)removeOverlay {
  dispatch_async(dispatch_get_main_queue(), ^{
     // update ui
  });
}

グランドセントラルディスパッチ(GCD)の詳細

于 2013-01-07T23:25:05.707 に答える
1

あなたが必要です

 [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

タイマーは、実行ループの適切なポイントに呼び出しを配置することによって機能します。

于 2013-01-07T23:23:44.633 に答える
1

誰も言及していないので、実行ループにタイマーを追加する代わりに、fireメソッドを使用することもできます。

[timer fire];
于 2013-01-07T23:28:34.587 に答える
0

一度だけ呼び出されたら[self performSelector:@selector(removeOverlay) afterDelay:(seconds you want to delay the use the method removeOverlay)];

于 2013-01-07T23:23:45.443 に答える