どちらの方法でも、ビューはparentviewの子として追加され、ビューはeventsを受け取ることができます。いつどれを使うの?
それらは非常に異なります。 addChildViewControllerは、ビューコントローラーを親コンテナービューコントローラーに関連付けますが、addSubviewは、ビューが追加されるビューのビュー階層にビューを追加します。前者の場合、新しい子View Controllerは、親の選択されたViewControllerであるときにイベントを処理する責任があります。タブバーコントローラーについて考えてみます。各タブには、親タブバーコントローラーのコンテンツ領域内にビューを表示し、対応するタブがタブバーで選択されたときにそのビュー内のユーザー操作を処理する、独自の「子」ビューコントローラーが関連付けられています。 addChildViewControllerは、カスタムコンテナビューがあり、そのchildViewControllersプロパティに新しいビューコントローラを追加する場合にのみ使用する必要があります。イベントを受信できるビュー階層に新しいビューを追加したいだけの場合は、そのように聞こえますが、addSubviewが最適です。 「コンテナビューコントローラの実装」セクションでは、addChildViewControllerの目的について説明しています。
それはすべて、新しいサブビューをどのように管理するかによって異なります。新しいサブビューを現在のビューのビューコントローラーで管理する場合(たとえば、いくつかのUILabel
オブジェクトのような単純なものを追加する場合)、単にaddSubview
を呼び出します。一方、新しいサブビューに独自のビューコントローラーがある場合(つまり、豊富な機能を備えた十分に複雑なビューのコレクションであるため、この新しいサブビューが行うすべてを管理するために、この複雑さのすべてを独自のコントローラーでカプセル化する必要があります)。 addChildViewController
を呼び出して新しいView Controllerを追加しますが、次にaddSubview
も呼び出します。
したがって、addChildViewController
自体はビューとは何の関係もないことに注意してください。通常は、そのビューを追加する呼び出しですぐにフォローします。これは、iOS用のView Controllerプログラミングガイドの カスタムコンテナView Controllerの実装 セクションから少し明確にされた例です:
[self addChildViewController:childViewController]; // add subview's view controller
childViewController.view.frame = ... // specify where you want the new subview
[self.view addSubview:childViewController.view]; // now you can add the child view controller's view
[childViewController didMoveToParentViewController:self]; // now tell the child view controller that the adding of it and its views is all done
したがって、それはaddSubview
対addChildViewController
の問題ではなく、addSubview
対addChildViewController
+ addSubview
の問題です。 addChildViewController
を呼び出す場合は、ある時点でそのビューに対してaddSubview
を呼び出すことを目的としています。
率直に言って、このaddSubview
とaddChildViewController
+ addSubview
の質問は、私たちがこれについてどう考えるかということはめったにありません。これについてのより論理的な考え方は、この新しいビューに独自のビューコントローラーがあるかどうかを判断することです。含まれている場合は、addChildViewController
シーケンスの呼び出しを実行します。そうでない場合は、addSubview
を呼び出すだけです。
ビューコントローラーの包含の概要(たとえば、そのAPIの理論的根拠、ビュー階層をビューコントローラー階層と同期させることの重要性など)については、WWDC 2011ビデオ IViewController包含の実装 を参照してください。
MVCがModel-View-Controllerを意味することを知っている:
viewのみを追加する場合は、addSubview
を使用します。例えばラベル、ボタンを追加します。
ただし、view+controllerを広告する場合は、addChildViewController
を使用する必要がありますコントローラーを追加し、またaddSubView
を追加してビューを追加します。例えば別のviewController、tableViewControllerを追加します。
加えて:
子ビューコントローラに転送されるイベントには、次の2つのカテゴリがあります。
1-外観の方法:
- viewWillAppear:
- viewDidAppear:
- viewWillDisappear:
- viewDidDisappear:
2-回転方法:
- willRotateToInterfaceOrientation:duration:
- willAnimateRotationToInterfaceOrientation:duration:
- didRotateFromInterfaceOrientation:
そうしないと問題が発生する例は ここ
詳細については、私が this の質問に対する回答を確認することを強くお勧めします。
addChildViewControllerはIViewControllerクラスのメソッドであり、addSubviewはIViewクラスにあります
どちらもまったく異なる動作をします。
addChildViewController現在のビューコントローラーの前にビューコントローラーを配置するだけです。コントローラのフローを管理する必要があります。このメソッドは、カスタムコンテナビューコントローラの実装によってのみ呼び出されることを目的としています。
addSubview別のビューをサブビューとしてそのオブジェクトのビューに追加します。
いくつかのテストに基づいて、次のことがわかりました。子ビューコントローラーが親ビューコントローラーに追加されていない場合(親ビューコントローラーがルートビューコントローラーの下にあると仮定)、子ビューコントローラーのビューのみが親ビューコントローラーのビューに追加されます。
- viewWillAppear:
、- viewWillLayoutSubviews
などのビューに直接関連するメッセージを引き続き受信できます。だが
- willRotateToInterfaceOrientation:duration:
などの一部のシステムメッセージを受信できません。ただし、現在メッセージリストを提供することはできません。
IOS 5から利用可能、_addChildViewController:
_
_- (void)addChildViewController:(UIViewController *)childController NS_AVAILABLE_IOS(5_0);
_
このメソッドを使用すると、任意のViewControllerを子として他のViewControllerに追加できますが、最初にchildControllerから親を削除してから、指定したコントローラーに子ViewControllerとして追加します。
子コントローラーはUIViewController
のインスタンスにすぎないため、ビューコントローラーの機能を提供します(つまり、通常のUIViewController
と同様に-(void)viewWillAppear
、-_(void)viewWillDisappear
_などのイベントを受け取ります) 。
一方
_ - (void)addSubview:(UIView *)view;
_
_addSubview:
_は、他のビューにsubview
としてビューを追加します。
選択ではありません特定のメソッドを使用するように要求するタイプである場合にどちらを使用するか。
インスタンスの場合-
UIViewController
のインスタンスがある場合は、必ず_addChildViewController:
_を使用し(presentModalViewController
、pushViewController
も使用できます)、UIView
のインスタンスがある場合は、間違いなくaddSubview
を使用する必要があります。
注:ビューコントローラのビューをサブビューとして他のビューに追加することもできます。
addChildViewControllerは、追加されたサブビューコントローラーが解放されないようにするために使用されます。つまり、親ビューコントローラーはサブビューコントローラーへの強力な参照を保持します。