2

NSNotificationCenterでセレクターメソッドreceiveChatTextを実行できません。問題は、NSNotification postNotificationNameがAppDelegate.mにあるのに、NSNotificationCenterがViewController.mにあるためかどうか疑問に思っています。IEは、postNotificationNameがNSNotificationCenterが別のviewControllerファイルにあることを知ることができますか、それとも私がそれを伝える必要があることですか?

viewController.mで私は持っています

 -(id)init
 {
self = [super init];
if(self){
    [[NSNotificationCenter defaultCenter] addObserver:self  
                                      selector:@selector(receiveChatText:) 
                                                      name:ChatMessageReceived  
                                               object:nil];
 return self;
}

- (void)receiveChatText:(NSNotification *)note {
NSLog(@"received chat text");

}

最上位のAppDelegate.mファイルには、次のものがあります。

 -(void) didReceiveMessage {
    [[NSNotificationCenter defaultCenter] postNotificationName:ChatMessageReceived 
                                          object:nil
                                          userInfo:nil];        
 }

didReceiveMessageが呼び出されたときにreceiveChatTextの実行を停止できるアイデアはありますか?

4

3 に答える 3

1

セレクター メソッド receiveChatText を取得できません…</p>

まず、receiveChatText:コロン付きです。これは、Objective-C —<code>receiveChatText: では重要でありreceiveChatText、同じメソッドを参照しないでください。

第二に、「セレクター」は、あなたが思っているような意味ではありません。セレクターはメソッドの名前です。通知センターからオブザーバーに送信するメッセージのセレクターを渡します。つまり、通知センターに「この通知が届いreceiveChatText:たら、私 [View Controller] にメッセージを送ってください」と伝えています。

… NSNotificationCenter で …</p>

通知センターにはメソッドがありませんreceiveChatText:。オブザーバー ( self) が行うため、通知センターにメッセージを送信してもらいたいのはそのためです。

…実行するには、問題は NSNotification の postNotificationName が AppDelegate.m にあるためかどうか疑問に思っています …</p>

AppDelegate.m にはそのようなものはありません。

アプリ デリゲートが通知を投稿します。

…しかし、NSNotificationCenter は ViewController.m にありますか?

ViewController.m にはそのようなものはありません。

View Controller は通知を監視します。

アプリのデリゲートが通知を送信する前に、View Controller がオブザーバーとして自身を追加する限り、これは機能します。うまくいかない場合は、どちらかまたは両方の手順が実行されていないか、間違った順序で実行されています。

IEはpostNotificationNameがNSNotificationCenterが別のviewControllerファイルにあることを知ることができますか、それとも私がそれを伝える必要がありますか?

通知センターはどちらのファイルにもありません。[NSNotificationCenter defaultCenter]アプリケーション全体で、それを使用したいオブジェクト間で共有されるシングルトン オブジェクトです。このようにして、アプリ デリゲートをビュー コントローラーや通知を監視している他のオブジェクトと通信させることができます。

デフォルトの通知センターにpostNotificationName:object:userInfo:メッセージを送信しています。これは、以前にメッセージを送信したはずのデフォルトの通知センターと同じですaddObserver:selector:name:object:。最初に監視を開始してから同じ通知センターに通知を送信する限り、通知センターは追加したオブザーバーに通知を送信できます。

receiveChatText を停止する可能性のあるアイデア

receiveChatText:

didReceiveMessage が呼び出されたときに実行されないようにしますか?

  1. didReceiveMessage通知を投稿していません。質問で示したコードが正確であると仮定すると、そうではありません。
  2. ビューコントローラーは通知を監視していません。作成時に監視を開始するため、まだ作成されていない可能性があります。initまたは、 NS/UIViewController ではなくオーバーライドしたことが原因である可能性がありますinitWithNibName:bundle:。さまざまなクラスの指定された初期化子が何であるかに注意してください。ドキュメントは通常言うでしょう。
  3. ビュー コントローラはまだ通知を監視していません: ビュー コントローラが監視を開始する前に (つまり、ビュー コントローラを作成する前に) 通知を送信しました。

userInfoまた、通知のすべてのオブザーバーに不特定のソースからの取得を強制するのではなく、チャット テキストを通知のオブジェクトとして、またはその に渡すこともできます。

于 2011-01-02T11:13:48.587 に答える
0

+defaultCenter は NSNotificationCenter のクラス メソッドであり、どこから呼び出しても、特定のプロセスで呼び出されるたびに同じ NSNotificationCenter インスタンスを返します。

「ChatMessageReceived」はどのように定義されていますか? それは NSString である必要がありますが、「ChatMessageReceived」という名前は、両方のクラスのコンテキストで有効なシンボルですか?

于 2011-01-02T07:49:44.567 に答える
0

ChatMessageReceivedの値が両方のインスタンスで同じである限り、それは機能するはずです。

デバッガーを使用して、通知が didReceiveMessage にポストされる前にinitビュー コントローラー ファイルのメソッドが呼び出されていることを確認しましたか?

于 2011-01-02T07:49:46.237 に答える