1. ホーム
  2. ios

[解決済み] iOS 5でView Controller Containmentはどのように機能するのか?

2022-11-30 06:26:16

質問

WWDC 2011 セッション 102 で、Apple は View Controller Containment を発表しました。これは、カスタムビューコントローラーコンテナを作成する機能で、次のようなものです。 UITabBarController , UINavigationController といった具合です。

例を何度か見てみました。このパターンに関連するメソッドが次々と出てきますが、それらを正確に把握するのは少し困難でした。私が考えることをここに投稿し、コミュニティが私の疑念を確認または否定するかどうか見てみようと思います。

シナリオ 1: 親なしから新しい親ビューコントローラーへの移動

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

最初の2行は、指定された順番でなければならないのでしょうか、それとも逆でもいいのでしょうか?

シナリオ2:親ビューコントローラから親ビューコントローラなしへの移動

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

を呼び出すことも必要でしょうか? [vc didMoveToParentViewController:nil] ? セッション102の例では はこれを行いませんでした。 を行いませんでしたが、それが省略されたのかどうかはわかりません。

シナリオ3:ある親ビューコントローラーから別の親ビューコントローラーに移動する

各親ビューコントローラのロジックはカプセル化されているため、これはおそらく次のように発生します。

// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];

// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];

質問

私の主な質問はこれです。一般的に、ビューコントローラの格納はこのように動作するのでしょうか?上に挙げた力学は正しいですか?

を呼び出す必要があるのでしょうか? willMoveToParentViewController を呼び出す前に addChildViewController ? これは論理的な順序のように私には思えますが、厳密に必要なのでしょうか?

を呼び出すことは必要でしょうか? didMoveToParentViewController:nil を呼び出した後に removeFromParentViewController ?

どのように解決するのですか?

この UIViewController をいつ呼んで、いつ呼ばないかについては、docs はかなり明確です。 willMove / didMove のメソッドを使用します。 チェックアウトは "コンテナ・ビュー・コントローラの実装" のドキュメントを参照してください。

ドキュメントによると、もしオーバーライドしないなら addChildViewController をオーバーライドしなければ willMoveToParentViewController: メソッドを呼び出す必要はありません。 しかし didMoveToParentViewController: メソッドを呼び出す必要があります。 同様に、コンテナビューコントローラが willMoveToParentViewController: メソッドを呼び出す前に removeFromParentViewController メソッドを呼び出す前に その removeFromParentViewController メソッドは didMoveToParentViewController: メソッドを呼び出します。

また、ワークアウトした例として はこちら とサンプルコード はこちら .

グッドラック