17

子ビューコントローラーは、子ビューコントローラーの実装内の次のコードによって削除されます。

- (void)commandFinishVC
{
    [ self.view removeFromSuperview];
    [ self removeFromParentViewController ];
}

子ビューコントローラとそのビューは正常に削除されますが、親はこれをどのように通知されますか?-viewDidDisappearは呼び出されず、-viewDidUnloadは非推奨になりました。

私が見つけた例から、親View Controllerは、削除される子を指名するイベントの発信者であると常に想定されていますが、(私にとって)子は、完了のロジックで自律的である必要があります。

self.parentViewControllerプロパティを利用し、親View Controllerで次のようなものを使用して、removeメソッドを呼び出す必要がありますか?

- (void)commandFinishVC
{
    [ childVC.view removeFromSuperview];
    [ childVC removeFromParentViewController ];
}
4

1 に答える 1

26

はい、通常、親コントローラーは子コントローラーの追加と削除を制御する必要があるため、2番目のアプローチの方が適切と思われます。UIViewControllerクラスリファレンスの「コンテナビューコントローラの実装」セクションを参照してください。

子が自分自身を削除するという以前のアプローチを回避できると思いますが、Appleはドキュメントに一貫性があり、 UIViewControllerContainmentの実装に関するWWDC2011セッションでは、コンテナコントローラが子を管理する責任があると述べています。

したがって、子供が親に削除されたことをどのように通知するかというあなたの質問に答えて、そのための確立されたプロトコルはありません。しかし、親がこのプロセスを開始すると想定されているため、これは驚くべきことではありません。そして、子供がこのプロセスを開始する必要がある限り、ドキュメントは、親が子コントローラーを管理するためのパブリックAPIを持っている必要があることを示唆しています。

そのため、子が親に通知するためのプロトコルはありませんが、親コントローラーが子に移動/削除されたことを通知する公開APIがあります。具体的には、親コントローラーが子を削除するときに、を呼び出す必要がありますwillMoveToParentViewControllerこのドキュメントには、この通知を実行する必要があることが明示的に記載されています。

独自のコンテナビューコントローラを実装している場合は、willMoveToParentViewController:メソッドを呼び出す前に子ビューコントローラのメソッドを呼び出す必要がありますremoveFromParentViewController...

したがって、『View Controllerプログラミングガイド』の「子の追加と削除」セクションで説明されているように、子を削除するときは、次のことを行う必要があります。

[childVC willMoveToParentViewController:nil];
[childVC.view removeFromSuperview];
[childVC removeFromParentViewController];

当然のことながら、のドキュメントdidMoveToParentViewControllerも同様に明確です。子コントローラーを追加するdidMoveToParentViewControllerときは、アニメーション/トランジション(存在する場合)が完了したときに呼び出す必要があります。これらの2つの通知メソッドを呼び出さなかった場合にどうなるかはわかりませんが、Appleはそうしなければならないと言っているので、そうするのが賢明なようです。

于 2013-01-04T23:07:48.423 に答える