9

タイマーがメソッドを呼び出すことはありません。私は何を間違っていますか?これはコードです:

NSTimer *manualOverlayTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(hideManual) userInfo:nil repeats:NO];

方法:

-(void)hideManual

ありがとう

4

5 に答える 5

28

スレッドの問題でした。私は修正しました:

dispatch_async(dispatch_get_main_queue(), ^{
    // Timer here
});
于 2012-07-17T07:24:13.203 に答える
3

この種のタスクには NSTimer は必要ありません。メインスレッドで特定の期間後にビューオブジェクトを非表示にするには、gcd メソッドの dispatch_after を使用できます

  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 2.0), dispatch_get_main_queue(), ^(void){
    // Your code
  });

ここで、2.0 はブロックが実行されるまでの秒数です。

于 2012-07-16T09:16:55.210 に答える
1

これを使うだけ

[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(hideManual) userInfo:nil repeats:NO];

編集

btnこのコードは、 (an UIButton) が押されて-(void)btnPressed関数が呼び出されたときにうまく機能します。

-(void)btnPressed{
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(hideManual) userInfo:nil repeats:NO];
}

-(void)hideManual{
    NSLog(@"Hi, I'm here!");
}
于 2012-07-16T09:14:16.430 に答える
0

コードフラグメントでは、がいつどこで発生したかは表示されませんNSTimer

を使用する場合はNSTimer、次のように、初期化後にタイマーを起動する必要があります。

NSTimer *_timer = [NSTimer scheduledTimerWithTimeInterval:2.f target:self selector:@selector(hideManual) userInfo:nil repeats:false];
[_timer fire];

ただし、任意のメソッドで次の行を使用することもできます。

[self performSelector:@selector(hideManual) withObject:nil afterDelay:2.f];

この場合、を使用するよりも簡単に見えますNSTimer

于 2012-07-16T13:00:01.467 に答える
0

これを試して :

NSTimer *manualOverlayTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
                              target:self
                              selector:@selector(hideManual)
                              userInfo:nil
                              repeats:YES];

repeat:YES instead of [[NSRunLoop currentRunLoop] addTimer:manualOverlayTimer forMode:NSDefaultRunLoopMode];
于 2012-07-16T09:19:43.577 に答える