web-dev-qa-db-ja.com

addChildViewControllerとaddSubviewの違いは?

どちらの方法でも、ビューはparentviewの子として追加され、ビューはeventsを受け取ることができます。いつどれを使うの?

12
user3745996

それらは非常に異なります。 addChildViewControllerは、ビューコントローラーを親コンテナービューコントローラーに関連付けますが、addSubviewは、ビューが追加されるビューのビュー階層にビューを追加します。前者の場合、新しい子View Controllerは、親の選択されたViewControllerであるときにイベントを処理する責任があります。タブバーコントローラーについて考えてみます。各タブには、親タブバーコントローラーのコンテンツ領域内にビューを表示し、対応するタブがタブバーで選択されたときにそのビュー内のユーザー操作を処理する、独自の「子」ビューコントローラーが関連付けられています。 addChildViewControllerは、カスタムコンテナビューがあり、そのchildViewControllersプロパティに新しいビューコントローラを追加する場合にのみ使用する必要があります。イベントを受信できるビュー階層に新しいビューを追加したいだけの場合は、そのように聞こえますが、addSubviewが最適です。 「コンテナビューコントローラの実装」セクションでは、addChildViewControllerの目的について説明しています。

11
iKe

それはすべて、新しいサブビューをどのように管理するかによって異なります。新しいサブビューを現在のビューのビューコントローラーで管理する場合(たとえば、いくつかの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

したがって、それはaddSubviewaddChildViewControllerの問題ではなく、addSubviewaddChildViewController + addSubviewの問題です。 addChildViewControllerを呼び出す場合は、ある時点でそのビューに対してaddSubviewを呼び出すことを目的としています。

率直に言って、このaddSubviewaddChildViewController + addSubviewの質問は、私たちがこれについてどう考えるかということはめったにありません。これについてのより論理的な考え方は、この新しいビューに独自のビューコントローラーがあるかどうかを判断することです。含まれている場合は、addChildViewControllerシーケンスの呼び出しを実行します。そうでない場合は、addSubviewを呼び出すだけです。

ビューコントローラーの包含の概要(たとえば、そのAPIの理論的根拠、ビュー階層をビューコントローラー階層と同期させることの重要性など)については、WWDC 2011ビデオ IViewController包含の実装 を参照してください。

22
Rob

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 の質問に対する回答を確認することを強くお勧めします

2
Honey

addChildViewControllerIViewControllerクラスのメソッドであり、addSubviewIViewクラスにあります

どちらもまったく異なる動作をします。

addChildViewController現在のビューコントローラーの前にビューコントローラーを配置するだけです。コントローラのフローを管理する必要があります。このメソッドは、カスタムコンテナビューコントローラの実装によってのみ呼び出されることを目的としています。

addSubview別のビューをサブビューとしてそのオブジェクトのビューに追加します。

2

いくつかのテストに基づいて、次のことがわかりました。子ビューコントローラーが親ビューコントローラーに追加されていない場合(親ビューコントローラーがルートビューコントローラーの下にあると仮定)、子ビューコントローラーのビューのみが親ビューコントローラーのビューに追加されます。

  • サブビューコントローラは、- viewWillAppear:- viewWillLayoutSubviewsなどのビューに直接関連するメッセージを引き続き受信できます。

だが

  • サブビューは、- willRotateToInterfaceOrientation:duration:などの一部のシステムメッセージを受信できません。

ただし、現在メッセージリストを提供することはできません。

1
HongchaoZhang

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:_を使用し(presentModalViewControllerpushViewControllerも使用できます)、UIViewのインスタンスがある場合は、間違いなくaddSubviewを使用する必要があります。

:ビューコントローラのビューをサブビューとして他のビューに追加することもできます。

1
Sanjay Mohnani

addChildViewControllerは、追加されたサブビューコントローラーが解放されないようにするために使用されます。つまり、親ビューコントローラーはサブビューコントローラーへの強力な参照を保持します。

0
Johnkui