nsnotification postnotificationname in appdelegateのnsnotificationcenter in viewcontroller?
-
14-10-2019 - |
質問
nsnotificationCenterでselectorメソッド、ReceiveChattextを実行することはできません。問題は、nsnotification postnotificationNameがappdelegate.mにあるためであるかどうか疑問に思っていますが、nsnotificationcenterはviewcontroller.mですか? IEは、notificationCenterが別の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];
}
ReceiveChattextが実行されるのを防ぐことができる理由は何ですか?
解決
Selectorメソッド、ReceIveChattextを取得できません…
まず、そうです receiveChatText:
, 、コロンで。これはObjective-Cで重要です -receiveChatText:
と receiveChatText
同じ方法を参照しないでください。
第二に、「セレクター」はあなたがそれが意味すると思うことを意味するものではありません。セレクターはメソッドの名前です。通知センターにオブザーバーに送信するメッセージをセレクターに渡します。つまり、通知センターに「この通知が到着したら、 receiveChatText:
私へのメッセージ[ビューコントローラー]」」。
…nsnotificationcenterで…
通知センターにはありません receiveChatText:
方法。あなたのオブザーバー(self
)それが、通知センターにメッセージを送信したい理由です。
…実行して、問題がnsnotification postnotificationNameがappdelegate.mにあるためであるかどうか疑問に思っています。
そのようなことはappdelegate.mにはありません。
アプリ委任は通知を投稿します。
…しかし、nsnotificationcenterはviewcontroller.mにありますか?
そのようなことはviewcontroller.mにありません。
ビューコントローラーは、通知を観察します。
アプリが通知を投稿する前に、ビューコントローラーがオブザーバーとして自分自身を追加する限り、これは機能します。それが機能しない場合、1つまたは両方のステップが発生しなかったか、間違った順序で発生しました。
IEは、notificationCenterが別のViewControllerファイルにあることを知ることができますか、それとも私がそれを伝える必要があることを知ることができますか?
通知センターはどちらのファイルにも含まれていません。 [NSNotificationCenter defaultCenter]
Singletonオブジェクトであり、使用したいオブジェクトの中でアプリケーション全体を通して共有されています。これで、アプリデリゲートをビューコントローラーと通知のために観察している他のオブジェクトと通信するために使用する方法です。
デフォルトの通知センターaを送信しています postNotificationName:object:userInfo:
メッセージ。これは、以前に送信する必要があるデフォルト通知センターと同じです addObserver:selector:name:object:
メッセージ。最初に観察を開始する限り、通知を同じ通知センターに送信する限り、通知センターは、追加したオブザーバーに通知を派遣することができます。
ReceIveChattextを停止できるアイデア
receiveChatText:
実行されることから、いつreceivemessageが呼ばれましたか?
didReceiveMessage
通知を投稿しませんでした。質問に示したコードが正確であると仮定すると、そうではありません。- ビューコントローラーは、通知を観察していません。創造について観察し始めるので、おそらくまだ作成されていません。または、それはあなたがオーバーライドしたからかもしれません
init
ns/uiviewcontroller'sではなくinitWithNibName:bundle:
. 。異なるクラスの指定された初期剤が何であるかに注意してください。通常、ドキュメントは言うでしょう。 - View Controllerはまだ通知を観察していません。Viewコントローラーが観察を開始する前に通知を投稿しました(つまり、ビューコントローラーを作成する前に)。
また、チャットテキストを通知のオブジェクトとして、またはその中に渡すことをお勧めします userInfo
, 、すべてのオブザーバーに通知を強制するのではなく、不特定のソースからそれを取得するようにします。
他のヒント
+defaultCenterは、NSNotificationCenterのクラスメソッドであり、どこから電話するかに関係なく、特定のプロセスで呼び出されるたびに同じnsnotificationCenterインスタンスを返します。
「chatmessagereceed」はどのように定義されていますか?それはnsstringであるべきですが、「Chatmessagereceived」という名前は、両方のクラスのコンテキストで有効なシンボルですか?
の価値がある限り、それは機能するはずです ChatMessageReceived
どちらの場合も同じです。
デバッガーを使用して、それを確認しましたか init
ビューコントローラーファイルのメソッドが呼び出されます 前 通知はdidreceivemessageに投稿されていますか?