0

特定のことが起こると、画面上の任意のビューコントローラの上部にアプリケーション通知のカスタムが表示されます。それをタップビューコントローラのナビゲーションをチェーンする方法(NSNotificationが受信されていない)

は、通知をトリガー:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DidTapOnNotification" object:nil];

その特定の通知のためのオブザーバーは、私はサブクラス自分のアプリケーションのためのルートのナビゲーションコントローラです。私はviewDidLoadのaddObserverです。この通知は、常に受信され、私は応答して実行するコードは次のとおりです。私は、任意に私は(私はそれていることが確認表示されるように、私のルートビューコントローラの時間を与えなければならなかったかどうかを確認するために遅延(dispatch_after)を加え

[CATransaction begin]; 
[CATransaction setCompletionBlock:^{ // this is called when the popToRootViewController animation completes 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"NavigateToController" object:nil userInfo:notification.userInfo]; 
    }); 
}]; 

[self popToRootViewControllerAnimated:YES]; 

[CATransaction commit]; 

2秒前に表示されます)。

私のルートビューコントローラでは、再度、NavigateToGroup通知のオブザーバとして追加します。私。私は[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(openController:) name:@"NavigateToController" object:nil];viewDidLoadと呼んでいます。

セレクタ(つまり、openController:メソッド)が必ずしも呼び出されるとは限りません。それが呼び出される唯一の時間は、アプリの通知をタップするときにコントローラ(ルートコントローラ)に既に入っているときです。その後、期待どおりに機能します。ナビゲーションスタックに他のコントローラがある場合、タップするとpopToRootが予想どおりになりますが、メソッドopenController:は通知がポストされたと確信しても決して呼び出されません。

ここで何が起こっているか知っていますか? 逆に、誰もこれを処理するより良い方法をお勧めしますか?

+0

dispatch_afterメソッドをコメントして実行してみてください。通知メソッドを直接実行します。そのビューは削除され、通知センターに電話をかけることはできません。 –

+0

これは私が以前にやっていたことですが、同様にコンソールに印刷されるNSNotification呼び出しのすぐ上にNSLogステートメントがあります。これは一般的なことですかNSNotificationCenter特有ですか? (printステートメントが記録されるのは不思議です)。それはおそらく、私がルート上にいる場合、popToRootが実際にコントローラを消さないので、それは意味をなさないでしょう。それがその理由です。もしそうなら、どうすればこのことを知ることができますか? – gadu

答えて

0

HariKrishnan.Pのコメントには真実があります。 NSNotificationsは、メッセージを送信しているビューコントローラが既にポップされている場合にはポストされていないようです。 (これが常に当てはまるが確かにここにいるように思われるかどうかは確かではない)

コードをリファクタリングして最初の通知を1つだけ送信し、委任を使用してこれをバイパスし、 NSNotification上では、おそらくより良い解決策と思われる。

関連する問題