2011-07-08 8 views
4

カウントダウンを表示するラベルを更新するタイマーでRunLoopを作った。タイマーが正常に終了した場合、カウントダウンが現在の日付+カウントダウンの時刻であるrunUntilDateを使用できるように、カウントダウンがゼロになったら、RunLoopを停止する必要があります。問題は、ユーザーが終了する前にボタンからカウントダウンをキャンセルした場合です。 RunLoopにキャンセルボタンの動作を停止するよう指示する方法はわかりません。 RunLoopのコードは次のとおりです。タイマーからNSRunLoopを停止する

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ずつ減らすようにラベルに指示します。

私はゼロにラベルを変更し、値がゼロであれば実行ループセレクタチェックを持つようにキャンセルボタンを伝えることができますが、実行ループの独自のセレクタが停止するようにそれを言うことができますか?

cancelPerformSelector:target:argument: 

cancelPerformSelectorsWithTarget: 

これらは私が見つけた最も近いが、彼らはRunLoops私はそれらを試したどのような方法で自分のセレクタ、または少なくともない内側から動作するようには思えません。

基本的に私はボタンが停止、または何らかの形でそれ自身のセレクタから実行ループを停止するために実行ループを伝えておく必要があります。

ありがとうございました。

+0

セレクタは単なるメソッドの名前です。私は自分の編集で単語の使用法を修正しました。 –

答えて

13

実行ループを作成していないため、メイン実行ループで開始するようにタイマーをスケジュールしました。あなたは何をすべき

を使用すると、実行ループにタイマーをスケジュールする前に、インスタンス変数として作成NSTimerオブジェクトを格納しています。

updateCountdownLabel:メソッドでは、終了条件が満たされたら、タイマーインスタンスで-invalidateを呼び出してください。これにより、実行ループからタイマーが削除され、保持しなかったために解放されます。

NSInvocationではなくセレクタベースのNSTimerを使用するようにメソッドを更新しました。つまり、コールバックメソッドのシグネチャは、期待どおりに定義されています。また、NSTimerオブジェクトをivarに格納する必要がありません。

- (void)startCountDown 
{ 

    NSTimer* timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateCountdownLabel:) userInfo:nil repeats:YES] 
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
} 


- (void)updateCountdownLabel:(NSTImer*)timer 
{ 
    if(thingsAreAllDone) 
    { 
     [timer invalidate]; 
    } 
} 
+0

"(id)anArg"を使用する場所では動作していないようですが、実際にはどうしたらいいですか?私はいつもタイマーを置く。この場合、私は " - (空)updateCountdownLabel:(NSTimer *)タイマー"を持っていましたが、先ほどとは違ったものを置いたことはありませんでしたが、タイマーのインスタンス変数を隠す "。 ifステートメントについては、ラベルがゼロより小さいか等しいかどうかをチェックしています。このコードではエラーは発生しませんが、ラベルがネガに数えられるのを止めることはありません。何か案は? – Elbimio

+0

セレクタベースの 'NSTimer'を使用するようにコードを更新しました。これはあなたに必要な結果を与えるはずです。 –

+0

問題が見つかりました。私はラベルの数値をintとして保存し、ifでそれを使用する変数が必要でした。ありがとう! – Elbimio

関連する問題