0

条件が満たされたときでもトリガーする必要があります (つまり、ランダムに移動するオブジェクトが特定の場所に到達する) が、ボタンのように常にリッスンしている必要があります。それ。これを行う方法はありますか?

4

3 に答える 3

0

を使用しNotificationCenterてオブザーバーを追加できます。

[[NSNotificationCenter defaultCenter] addObserver:yourObserver selector:yourSelector name:kNotificationName object:nil];

これにより、yourObserverget 通知が次のように送信されます。

[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationName object:self userInfo:nil];

userInfo通知でオブジ​​ェクトを送信するためのその他のオプションについては、リファレンスを参照してください。

編集:

通知を投稿するときに関しては、多くのコンテキストを提供していませんが、一般に、オブジェクトが特定の位置に到達したかどうかを知る唯一の方法は、オブジェクトが画面上で移動するたびに確認することです。

ゲームに使用される物理エンジンの 1 つ (シマリス、box2d) を使用して、固定スポットとの衝突をチェックすることを考えるかもしれません...しかし、このオプションがあなたにとって意味があるかどうかは、アプリによって異なります...

タッチ イベントに応答してオブジェクトを移動している場合、オブジェクトが指定された位置に到達したかどうかを確認する適切な場所は ですtouchesMoved

于 2012-06-15T14:20:01.290 に答える
0

あなたは通知について話しているかもしれませんか?それらは によって表され、 によってNSNotificationキューに入れられ、ディスパッチされNSNotificationCenterます。

通知センターはシステムの共有シングルトンであるため、それを使用するには、次のように要求します+defaultCenter

NSNotificationCenter *myCenter = [NSNotificationCenter defaultCenter];

2 つの主な方法のいずれかで、特定の通知のオブザーバーとして自分自身を登録できます。まず、伝統的なもの:

  [myCenter addObserver:self selector:@selector(handleNotification:) name: NSApplicationWillHideNotification object:nil];

これにより、 がキューにポストされるたびにセレクターhandleNotification:を送信するように通知センターに指示されます。への引数は、キューにポストされたオブジェクトになります。selfNSApplicationWillHideNotificationhandleNotification: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通知プログラミングのトピックで、これと他のあらゆる種類の通知について読んでください。

于 2012-06-15T14:50:11.517 に答える
0

あなたが探しているのは 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
    }
}

プロパティが設定されるたびに、オブザーバーに通知されます。

于 2012-06-15T20:22:58.783 に答える