条件が満たされたときでもトリガーする必要があります (つまり、ランダムに移動するオブジェクトが特定の場所に到達する) が、ボタンのように常にリッスンしている必要があります。それ。これを行う方法はありますか?
3 に答える
を使用しNotificationCenter
てオブザーバーを追加できます。
[[NSNotificationCenter defaultCenter] addObserver:yourObserver selector:yourSelector name:kNotificationName object:nil];
これにより、yourObserver
get 通知が次のように送信されます。
[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationName object:self userInfo:nil];
userInfo
通知でオブジェクトを送信するためのその他のオプションについては、リファレンスを参照してください。
編集:
通知を投稿するときに関しては、多くのコンテキストを提供していませんが、一般に、オブジェクトが特定の位置に到達したかどうかを知る唯一の方法は、オブジェクトが画面上で移動するたびに確認することです。
ゲームに使用される物理エンジンの 1 つ (シマリス、box2d) を使用して、固定スポットとの衝突をチェックすることを考えるかもしれません...しかし、このオプションがあなたにとって意味があるかどうかは、アプリによって異なります...
タッチ イベントに応答してオブジェクトを移動している場合、オブジェクトが指定された位置に到達したかどうかを確認する適切な場所は ですtouchesMoved
。
あなたは通知について話しているかもしれませんか?それらは によって表され、 によってNSNotification
キューに入れられ、ディスパッチされNSNotificationCenter
ます。
通知センターはシステムの共有シングルトンであるため、それを使用するには、次のように要求します+defaultCenter
。
NSNotificationCenter *myCenter = [NSNotificationCenter defaultCenter];
2 つの主な方法のいずれかで、特定の通知のオブザーバーとして自分自身を登録できます。まず、伝統的なもの:
[myCenter addObserver:self selector:@selector(handleNotification:) name: NSApplicationWillHideNotification object:nil];
これにより、 がキューにポストされるたびにセレクターhandleNotification:
を送信するように通知センターに指示されます。への引数は、キューにポストされたオブジェクトになります。self
NSApplicationWillHideNotification
handleNotification:
NSNotification
「名前」は、通知したい通知の「タイプ」または「種類」を決定します。これらの大きな標準的なリストはどこにもないと思いますが、ほとんどはドキュメントから見つけることができます。たとえば、「NSApplication Class Reference」を見ると、下部に「通知」と呼ばれるセクション全体があり、投稿する通知とその理由を説明しています。
の最後の引数に注意してください-addObserver:selector:name:object:
。の代わりにそこにオブジェクトを渡すと、nil
そのオブジェクトから送信された通知のみを受信します (システム上のどこかに投稿されたその名前のすべての通知とは対照的に...非常に騒々しい可能性があります)。
登録する通知ごとに、登録を解除する必要があることに注意してください。オブザーバーの割り当てが解除され、通知センターがジャンク メモリにメッセージを送ろうとすると、悪いことが起こる可能性があります。あなたの-dealloc
(または同等のもの)で、必ず次を追加してください:
[myCenter removeObserver:self name:NSApplicationWillHideNotification object:nil];
通知を登録する 2 つ目の方法は、ブロックを使用することです。
[self setMyNotificationObserver:[myCenter addObserverForName:NSApplicationWillHideNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification){
// Do something...
}]];
name:
とobject:
同じです。ただし、オブジェクトをセレクターに登録する代わりに、指定された名前の通知が受信されるたびに呼び出されるブロックを登録しています。追加のパラメータ「queue」を使用するとNSOperationQueue
、通知を実行する対象を指定できます。これは、このスタイルの通知処理を使用する主な利点の 1 つです。通常、通知のオブザーバーは、元の通知を投稿したスレッドで呼び出されます。これにより、特定のスレッドでハンドラーが常に呼び出されるように指定できます。メイン スレッドで実行する必要がある UI の更新に非常に役立ちます。
-addObserverForName:object:queue:usingBlock:
最後に、 によって返された値をプロパティに代入していることに注意してくださいmyNotificationObserver
。これは、ブロック構文を使用するときにオブザーバーを登録解除する方法です。次のように使用します。
[myCenter removeObserver:[self myNotificationObserver]];
もちろん、独自のカスタム通知を に投稿することもできますNSNotificationCenter
。通知プログラミングのトピックで、これと他のあらゆる種類の通知について読んでください。
あなたが探しているのは Key Value Observing ( KVO ) と呼ばれるものだと思います。
randomMovingObject にスポットを含む合成プロパティがある場合、次の行を使用して観察を開始できます。
[randomlyMovingObject addObserver:theObserver forKeyPath:@"spot" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL];
スポットに関する変更に対応するには、オブザーバーに次のメソッドを実装する必要があります。
-(void)observeValueForKeyPath:(NSString *)theKeyPath ofObject:(id)theObject change:(NSDictionary *)change context:(void *)context {
if ([theKeyPath isEqualToString:@"spot"]) {
// react to changes
}
}
プロパティが設定されるたびに、オブザーバーに通知されます。