あなたの問題に対するより一般的な答えを提供しようとします.iOSプログラミングはMVC(Model-View-Controller)ソフトウェアアーキテクチャパターンに基づいているため、アプリケーションを可能な限りMVCに準拠させる必要があります. これは、あなたの場合、ローカル通知を受け取るとすぐに、アプリがフォアグラウンドで実行されているか、バックグラウンドでスリープしているか、または単に最初から起動する準備ができていても、MVC ブリックが動作する場合、アプリは同じように動作することを意味します。正しく設定されています。
そう:
- ローカル通知はアプリに新しいデータを提供するため、モデルを更新する必要があります
- モデルを更新したら、アプリ ビュー コントローラーにモデルの変更を通知します。
- View Controller が表示されている場合は、モデルを表すビューの変更が反映されます。表示されていない場合は、アプリで View Controller を表示してから、モデルのステータスに基づいてビューを更新する必要があります。
これを行う方法は明らかに、アプリがさまざまなビューを表示する方法と場所によって異なりますが、物事をシンプルに保つために次のことができます。
- 起動時のローカル通知を反映するモデルを作成する (application:didFinishLaunchingWithOptions:)
- 起動時にローカル通知データを表示するView Controllerを作成します(注:モデルを提供してView Controllerを「初期化」します。ビューはまだ気にしません)
- モデルとView Controllerが初期化された後、ローカル通知を処理します
したがって、ローカル通知を受け取ると、アプリは次のようになります。
- モデルを更新します (これは、アプリがフォアグラウンドにある場合、またはスリープから再開する場合、または最初から開始する場合の 3 つのケースすべてに存在します)
- この時点で、ビュー コントローラー ビューが既に表示されている場合は、新しいモデル データで更新するだけです。表示されていない場合は、ビュー階層にビュー コントローラー ビューを追加します (たとえば、メインのナビゲーション コントローラー スタックにプッシュすることによって)。ビューの更新は、viewDidLoad によって行われます。
ご覧のとおり、これを管理するための特別なコードは必要ありませんが、アプリが通知を受け取ったときにローカル通知関連のビューを表示する必要はありません。ローカル通知ビューがビュー階層の奥深くにあり、ある程度の一貫性を維持する必要がある場合、明らかに事態ははるかに複雑になります。そのような場合、階層全体を再構築する必要があり、これを行う可能性はローカル通知によって提供される情報に依存します。単純なケースでは、メイン ナビゲーション コントローラーをインスタンス化した後、メイン ウィンドウ階層のすぐ内側にローカル通知ビュー コントローラーを配置できます: [applicationWindow setRootController:mainNavigationController] ローカル通知コントローラーをナビゲーション コントローラー スタックにプッシュします。 [mainNavigationController pushViewController:myLocalNotificationViewController アニメーション:YES]
特定の問題の詳細を入力していない場合は申し訳ありませんが(できません)、おそらく私の説明は、あなたのケースが特別なケースではなく、メインのiOSアーキテクチャパターンに注意深く従うことで簡単に管理できることを理解するのに役立ちます. .