2011-12-05 13 views
103

WWDC 2011セッション102では、Appleは、UITabBarController,UINavigationControllerなどに類似した、カスタムView Controllerコンテナを作成するView Controller Containmentを導入しました。View Controller ContainmentはiOS 5ではどのように機能しますか?

私はいくつかの例を見ました。このパターンに関連した方法の混乱がありますが、それらを正確に把握するのは少し難しかったです。私はここに私が行っていると思うことを投稿し、コミュニティが私の疑惑を確認するかどうか確認するつもりです。

シナリオ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:各親ビューコントローラ内のロジックがカプセル化されるので、これは、おそらく、次のように発生する別の

1つの親ビューコントローラから移動します。

// 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]; 

質問

私の主な質問はこれです:これは一般的には、ビューコントローラの封じ込めがどのように動作するかをですか?上記の力学は正しいですか?

addChildViewControllerに電話する前にwillMoveToParentViewControllerに電話する必要がありますか?これは私にとっては論理的な秩序のようですが、厳密に必要ですか?

に電話する前にremoveFromParentViewControllerに電話をする必要がありますか?

+9

問題は、ios5タグを追加しようとしたときに誤って投稿を追加した編集者が入力/編集を完了していないにもかかわらずでした。私はそれを削除しようとしたが、私はそれを削除するために投票することしかできないことを発見した。 –

答えて

71

UIViewControllerは、willMove/didMoveのメソッドを呼び出すことができないときとそうでないときにかなり明確です。 "Implementing a Container View Controller"のドキュメントをご覧ください。

addChildViewControllerを上書きしないと、willMoveToParentViewController:メソッドを呼び出す必要はありません。ただし、移行が完了した後にdidMoveToParentViewController:メソッドに電話する必要があります。同様に、removeFromParentViewControllerメソッドを呼び出す前にwillMoveToParentViewController:メソッドを呼び出すのは、コンテナビューコントローラの責任です。removeFromParentViewControllerメソッドは、子ビューコントローラのdidMoveToParentViewController:メソッドを呼び出します。

また、hereとサンプルコードhereを試した例があります。

グッドラック

+15

私は見ているので、 'addChildViewController'は' didMoveToParentViewController'とバランスを取って、 'willMoveToParentViewController'は' removeFromParentViewController'とバランスをとるべきです。これはまさに私が探していたものです。どのように私はドキュメントでそれを逃したか分からない。 –

+0

なぜですか?なぜあなたはwillMoveToParentViewControllerを呼び出す必要はありませんが、didMoveToParentViewControllerを呼び出すことはありませんか? –

+0

これはドキュメントのことです。 Appleは明らかに私たちが知る必要がないと感じている。 –

21

この部分が正しくありません:

[vc willMoveToParentViewController:self]; 
[self addChildViewController:vc]; 
[self.view addSubview:vc.view]; // or something like this. 
[vc didMoveToParentViewController:self]; 
カスタムコンテナがaddChildViewController呼び出す

According to the docs:

:メソッドは、それが自動的にwillMoveToParentViewController呼び出します。ビューの方法コントローラを追加する前に子として追加することができます。

したがって、[vc willMoveToParentViewController:self]コールは必要ありません。 [self addChildViewController:vc]に電話すると自動的に行われます。ここでのサンプルコードは、再びです:

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

For removing view controllers:

removeFromParentViewControllerメソッドが自動的にdidMoveToParentViewControllerを呼び出す:子ビューコントローラの方法、それは子を削除した後。

この呼び出しはおそらく[oldVC didMoveToParentViewController:nil]です。

[vc willMoveToParentViewController:nil]; 
[vc.view removeFromSuperview]; 
[vc removeFromParentViewController]; 
// [vc didMoveToParentViewController:nil] called automatically 
+0

それ以外の場合は、動作しているように見えても、presentViewViewControllerがpresentViewControllerに設定されていないようです。 – Adrian

+0

文書では、 'didMoveToParentViewController' ** ** addChildViewController:メソッドを呼び出した直後に**を呼び出すと、実際に子サブビューを追加するときは指定されません。私は誰もがこれを間違っているのだろうかと思います。いくつかのApple Docsにこれを確認できる例がありますか? – Robert

+0

注:移動するアイテムがオーバーライドされた 'addChildViewController'を持つカスタムクラスである場合(overrideが内部的に呼び出さない限り)、' addChildViewController'の前に 'willMoveToParentViewController'を呼び出す必要があります。 – bunkerdive

関連する問題