タイマーがメソッドを呼び出すことはありません。私は何を間違っていますか?これはコードです:
NSTimer *manualOverlayTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(hideManual) userInfo:nil repeats:NO];
方法:
-(void)hideManual
ありがとう
タイマーがメソッドを呼び出すことはありません。私は何を間違っていますか?これはコードです:
NSTimer *manualOverlayTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(hideManual) userInfo:nil repeats:NO];
方法:
-(void)hideManual
ありがとう
スレッドの問題でした。私は修正しました:
dispatch_async(dispatch_get_main_queue(), ^{
// Timer here
});
この種のタスクには 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 はブロックが実行されるまでの秒数です。
これを使うだけ
[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!");
}
コードフラグメントでは、がいつどこで発生したかは表示されません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
。
これを試して :
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];