私は次の環境を持っています:
- ルートビューコントローラーはUINavigationControllerです
- 多数のカスタムUIViewControllerをナビゲーションスタックにプッシュできます
- 各カスタムコントローラーは、モーダルビューコントローラーを表示する場合と表示しない場合があります
- ナビゲーションスタックをプログラムで管理できる必要があります(たとえば、プッシュ通知配信などの外部イベントへの応答として、ルートコントローラーを除くすべてのコントローラーをナビゲーションスタックから削除します)
[navigationController setViewControllers:newControllers animated:animated];
スタック内の古いコントローラーのいずれかによって提示されたモーダルビューコントローラーがあった場合、ナイーブな実装は明らかに失敗します。
- このモーダルコントローラーは表示されたままになります
- 親<->モーダルコントローラの通信に委任パターンが使用されている場合(親は提示されたモーダルビューコントローラのデリゲートです)、デリゲートがすでに解放されているため、モーダルビューコントローラでアクションを実行するとクラッシュします。
したがって、一般的な問題は、モーダルコントローラーのlifcycleが親コントローラーにバインドされていないことです。私の質問は次のとおりです。
- この種の階層と安全なナビゲーションスタックの変更を管理するための標準的なアプローチはありますか?
- いいえの場合、最良のカスタム実装は何でしょうか?私は2つの一般的なアプローチを見ています-1つはナビゲーションスタックを変更するコード内のすべてのモーダルコントローラーを明示的に解除/リンク解除すること、もう1つはモーダルコントローラーのライフサイクルを直接管理するために親ビューコントローラーにロジックを追加することです。