これらの質問が何度も出てきたことは知っていNSTimer
ますが、UI を変更するブロックの実行を伴うものはないように見えるので、これはまだオリジナルの質問であると考えました。
私はそのサブクラスを持っています。UIButton
便宜上(Android
バックグラウンドから来た私)にはonClick
andonHoldClick
関数があります。onClick
は単にブロックを取り、に応答するセレクターでそれを実行しUIControlEventTouchUpInside
ます。クリック機能が大活躍。例えば:
[myButton setOnClick:^{
NSLog(@"clicked");
}];
ホールド クリック機能がうまく機能していません。
[myButton setOnHoldClick:^{
NSLog(@"still holding click...");
}];
UIControlEventTouchDown
これはイベントをリッスンし、遅延後にタスクを実行します。
- (void)clickDown:(id)sender
{
isClicked = YES;
[self performSelector:@selector(holdLoop:) withObject:nil afterDelay:delay];//For the sake of the example, delay is set to 0.5
}
ホールド ループは、ブロックの実行を処理する別の関数で繰り返しタイマーを実行します (タイマー変数はNSTimer
ヘッダー ファイルで宣言されています)。
-(void)holdLoop:(id)sender
{
[self cancelTimers];
_timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(death:) userInfo:nil repeats:YES];
}
-(void)death:(id)_delay
{
if (isClicked)
{
_holdBlock();
}
else
{
[self cancelTimers];
}
}
実行するブロックは、再描画されるラベルの値を更新するために使用される float の値を変更します。
ホールド クリック イベントが初めて発生したとき、これはうまく機能します。その後、タイマーがキャンセルされないようで、新しいタイマーが追加され続けています。これは私のcancelTimers
関数がどのように見えるかです (ここでの呼び出しは、このトピックに関する他の質問のコレクションから取得されます):
-(void)cancelTimers
{
[_timer invalidate];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(death:) object:nil];
}
私は何を間違っていますか、どうすれば修正できますか?
編集
実際、私はすでにタッチアップに応答する関数を内部に持っています:
- (void)clickUp:(id)sender
{
isClicked = NO;
[self cancelTimers];
_clickBlock();
}
さらに、この問題は未処理のキャンセル イベントが原因であることに気付きました。iOS が長押しを自動キャンセルする理由はありますか?