はい、通常、親コントローラーは子コントローラーの追加と削除を制御する必要があるため、2番目のアプローチの方が適切と思われます。UIViewControllerクラスリファレンスの「コンテナビューコントローラの実装」セクションを参照してください。
子が自分自身を削除するという以前のアプローチを回避できると思いますが、Appleはドキュメントに一貫性があり、 UIViewControllerContainmentの実装に関するWWDC2011セッションでは、コンテナコントローラが子を管理する責任があると述べています。
したがって、子供が親に削除されたことをどのように通知するかというあなたの質問に答えて、そのための確立されたプロトコルはありません。しかし、親がこのプロセスを開始すると想定されているため、これは驚くべきことではありません。そして、子供がこのプロセスを開始する必要がある限り、ドキュメントは、親が子コントローラーを管理するためのパブリックAPIを持っている必要があることを示唆しています。
そのため、子が親に通知するためのプロトコルはありませんが、親コントローラーが子に移動/削除されたことを通知する公開APIがあります。具体的には、親コントローラーが子を削除するときに、を呼び出す必要がありますwillMoveToParentViewController
。このドキュメントには、この通知を実行する必要があることが明示的に記載されています。
独自のコンテナビューコントローラを実装している場合は、willMoveToParentViewController:
メソッドを呼び出す前に子ビューコントローラのメソッドを呼び出す必要がありますremoveFromParentViewController
...
したがって、『View Controllerプログラミングガイド』の「子の追加と削除」セクションで説明されているように、子を削除するときは、次のことを行う必要があります。
[childVC willMoveToParentViewController:nil];
[childVC.view removeFromSuperview];
[childVC removeFromParentViewController];
当然のことながら、のドキュメントdidMoveToParentViewController
も同様に明確です。子コントローラーを追加するdidMoveToParentViewController
ときは、アニメーション/トランジション(存在する場合)が完了したときに呼び出す必要があります。これらの2つの通知メソッドを呼び出さなかった場合にどうなるかはわかりませんが、Appleはそうしなければならないと言っているので、そうするのが賢明なようです。