4

私は次の環境を持っています:

  • ルートビューコントローラーはUINavigationControllerです
  • 多数のカスタムUIViewControllerをナビゲーションスタックにプッシュできます
  • 各カスタムコントローラーは、モーダルビューコントローラーを表示する場合と表示しない場合があります
  • ナビゲーションスタックをプログラムで管理できる必要があります(たとえば、プッシュ通知配信などの外部イベントへの応答として、ルートコントローラーを除くすべてのコントローラーをナビゲーションスタックから削除します)

[navigationController setViewControllers:newControllers animated:animated];スタック内の古いコントローラーのいずれかによって提示されたモーダルビューコントローラーがあった場合、ナイーブな実装は明らかに失敗します。

  1. このモーダルコントローラーは表示されたままになります
  2. 親<->モーダルコントローラの通信に委任パターンが使用されている場合(親は提示されたモーダルビューコントローラのデリゲートです)、デリゲートがすでに解放されているため、モーダルビューコントローラでアクションを実行するとクラッシュします。

したがって、一般的な問題は、モーダルコントローラーのlifcycleが親コントローラーにバインドされていないことです。私の質問は次のとおりです。

  1. この種の階層と安全なナビゲーションスタックの変更を管理するための標準的なアプローチはありますか?
  2. いいえの場合、最良のカスタム実装は何でしょうか?私は2つの一般的なアプローチを見ています-1つはナビゲーションスタックを変更するコード内のすべてのモーダルコントローラーを明示的に解除/リンク解除すること、もう1つはモーダルコントローラーのライフサイクルを直接管理するために親ビューコントローラーにロジックを追加することです。
4

3 に答える 3

2

この動作はHIGによって推奨されていないため、標準的なアプローチはありません。プッシュ通知が発生した場合でも、プッシュ、ポップ、およびポップからルートを経由する場合を除いて、既存のスタックを変更することは想定されていません。しかし、あなたが求めていることは完全に可能です。

いくつかのオプションがありますが、おそらく通知が最善です。アプリデリゲートで使用して、関心のあるView Controllerに、ルートViewControllerにポップしよNSNotificationCenterとしていることを知らせます。各モーダルビューコントローラーで、この通知名を登録し、通知されたら自分を却下します。モーダルを閉じた後は、スタックを変更するだけで混乱を回避できます。popToRootViewController

TweetBotを見て、プッシュ通知をどのように処理するかを確認してください。彼らはかなり良い仕事をしていると私は信じています、そして彼らはただ新しいモーダルビューコントローラーを提示します。これを行うことができるので(ネストされたモーダルプレゼンテーション)、ユーザーを不快にさせることなく何ができるかを試してみてください。

于 2012-04-16T11:52:03.867 に答える
1

このメソッドを確認してください: http: //developer.apple.com/library/ios/documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/occ/instm/UINavigationController/popToRootViewControllerAnimated

また、モーダルコントローラーは正当な理由でモーダルです。1つのタスクや作業単位、またはアプリが行うことすべてにユーザーの注意を引くためです。したがって、プログラムで非表示にしてナビゲーションスタック内の他のコントローラーに戻りたい場合は、最初にモーダルコントローラーを処理する必要があることは明らかです。

于 2012-04-16T11:53:06.440 に答える
0

[self dismissModalViewControllerAnimated:YES]を呼び出します。ビューコントローラの-(void)viewDidUnloadメソッドから。

于 2012-04-16T12:18:20.487 に答える