カウントダウンを表示するラベルを更新するタイマーを使用して RunLoop を作成しました。カウントダウンがゼロになったら RunLoop を停止する必要があります。タイマーが正常に終了した場合は、runUntilDate を使用できます。日付は現在の日付 + カウントダウンの時間です。問題は、ユーザーがカウントダウンが完了する前にボタンからキャンセルした場合です。RunLoop にキャンセル ボタン アクションから停止するように指示する方法がわかりません。RunLoop のコードは次のとおりです。
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:
[self methodSignatureForSelector:@selector(updateCountdownLabel:)]];
[invocation setTarget:self];
[invocation setSelector:@selector(updateCountdownLabel:)];
[[NSRunLoop mainRunLoop] addTimer:[NSTimer timerWithTimeInterval:1 invocation:invocation repeats:YES] forMode:NSRunLoopCommonModes];
このメソッドは、各ループで 1 ずつ減らすようにラベルに指示するだけです。
キャンセル ボタンにラベルをゼロに変更するように指示し、実行ループ セレクターに値がゼロかどうかをチェックさせることはできますが、RunLoop 自体のセレクターに停止を指示することはできますか?
cancelPerformSelector:target:argument:
cancelPerformSelectorsWithTarget:
これらは私が見つけた最も近いものですが、RunLoops 独自のセレクター内からは機能しないようです。少なくとも、私が試した方法では機能しません。
基本的に、RunLoopに停止するようにボタンに指示するか、何らかの方法で独自のセレクターからRunLoopを停止する必要があります。
ありがとう。