2011-01-02 12 views
2

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

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

ときdidReceiveMessage実行されてからreceiveChatTextを止めることができるものの任意のアイデア:私は

-(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ファイルで、私は次のように持っているviewController.mで

と呼ばれる?

答えて

1

私は...

ファーストを選択する方法、receiveChatTextを得ることができない、それはコロンで、receiveChatText:です。これはObjective-Cで重要です - receiveChatText:receiveChatTextは同じメソッドを参照していません。

第2に、「セレクタ」は、あなたが何を意味するかを意味するものではありません。セレクタはメソッドの名前です。通知センターがオブザーバに送信するメッセージのセレクタを渡します。つまり、通知センターに「この通知が届いたら、receiveChatText:メッセージを私に[ビューコントローラ]として送信してください」と伝えています。

... NSNotificationCenterに...

通知センターはreceiveChatText:メソッドを持っていません。あなたのオブザーバー(self)がそうしています。それが通知センターにメッセージを送信する理由です。実行する

...とNSNotification postNotificationNameがAppDelegate.mであるため、問題がある場合、私は疑問に思って...

なものはAppDelegate.mではありません。

アプリデリゲートが通知を送信します。

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

このようなことはViewController.mにありません。

ビューコントローラは通知を監視します。

アプリケーションコントローラが通知をポストする前に、ビューコントローラがオブザーバとして追加されている限り、これは機能します。それがうまくいかない場合、どちらか一方または両方のステップが起こらなかったか、または間違った順序で起こった。

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

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

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

didReceiveMessageが呼び出されたときに実行されることからreceiveChatText

receiveChatText:

を止めることができるものの任意のアイデア?

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

また、かなりの不特定のソースからそれを取得するために、通知のすべてのオブザーバを強制するよりも、通知の対象として、またはそのuserInfoにチャットテキストを渡したいかもしれません。

+0

#2が問題でした。以前は、initWithNibNameを使用してanother_viewController.mからviewController.mを作成しました。私が投稿したとき、viewController.mの中にinitがありました。だから私は最初のinitWithNibNameが後のinitをオーバーロードすると思います。ですから、私はanother_viewController.mからviewControllerを作成しました。ちょうどinitを使っていました。ありがとう! –

+0

@James:いいえ、 'initWithNibName:bundle:'は 'init'をオーバーライドしませんでした。繰り返しますが、メッセージの観点から考える必要があります。あなたのサブクラスで 'init'を実装(オーバーライド)するのは、何かが' init'メッセージを送ることでオブジェクトを初期化するときだけです。オブジェクトに 'initWithNibName:bundle:'メッセージを送るとき、そのメッセージが代わりに 'init'実装を打つことを期待する理由はありません。 'initWithNibName:bundle:'を使用して作成する場合、それを実装する必要があります。 'init'を使ってそれを作成するなら、それを実装する必要があります。使用するイニシャライザ(またはイニシャライザ)を実装する必要があります。 –

0

+ defaultCenterはNSNotificationCenterのクラスメソッドで、NSNotificationCenterインスタンスは、呼び出し元に関係なく、指定されたプロセスで呼び出されるたびに同じNSNotificationCenterインスタンスを返します。

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

+1

ChatMessageReceivedは、AppDelegate.mで#define ChatMessageReceived @ "ChatMessageReceived"として定義されています。だから、それは私のクラスの両方の文脈で有効なシンボルです。 –

0

ChatMessageReceivedの値が両方のインスタンスで同じであれば、動作するはずです。

あなたは通知がdidReceiveMessageに掲載されて前に、ビューコントローラファイル内init方法がと呼ばれていることを確認するためにデバッガを使用することがありますか?

関連する問題