WWDC 2011のセッション102で、Appleはに類似したカスタムビューコントローラコンテナを作成する機能、あるビューコントローラ封じ込め、導入UITabBarController
、UINavigationController
などを。
例を何度か見ました。このパターンに関連付けられているメソッドはさまざまですが、正確に把握するのは少し困難でした。私はここで私が起こっていると思うことを投稿し、コミュニティが私の疑いを確認するかどうかを確認します。
シナリオ1:親がない状態から新しい親View Controllerに移動する
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];
最初の2行は指定された順序で発生する必要がありますか、それとも逆にすることができますか?
シナリオ2:親View Controllerから親View Controllerなしに移動する
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
電話も必要[vc didMoveToParentViewController:nil]
ですか?セッション102の例では、このシナリオではこれを行いませんでしたが、それが省略であったかどうかはわかりません。
シナリオ3:ある親View Controllerから別のView Controllerへの移動
各親ビューコントローラーのロジックがカプセル化されるため、これは次のように発生する可能性があります。
// 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
か?
addChildViewController
でバランスされなければならないdidMoveToParentViewController
とwillMoveToParentViewController
してバランスする必要がありますremoveFromParentViewController
。これはまさに私が探していたものです。私がドキュメントでどのようにそれを逃したかわかりません。