web-dev-qa-db-ja.com

addChildViewControllerとpushViewControllerを使用する場合

「UIViewController Containmentの実装」に関する2011 WWDCプレゼンテーションを見ました( ビデオへのリンク

彼らは、画面にviewControllersを追加するこれらの方法の両方に言及しました、そして、私はベストプラクティスに関するいくつかの明確化を感謝します...

addChildViewController/removeFromParentViewController
@ property(非アトミック、読み取り専用)NSArray * childViewControllersおよび[self transitionFromViewController:currentView toViewController:nextView duration: options: animations: completion:];

pushViewController:animated:/ popViewControllerAnimated
彼らはプレゼンテーションの中でこれを本当にすり抜けました

私のアプリではすべてのカスタムviewControllerを使用していますが、今日までは常に次の方法で管理していました。

[nextController performSelector:@selector(setDelegate:) withObject:self];
[currentPageController.view removeFromSuperview];
[self.view addSubview:nextController.view];

しかし、私はこれが悪い習慣であることを理解し、「addChildViewController」を使用する正しい方法と「pushViewController」を使用する正しい方法は何か疑問に思っていますか?

問題についてのあなたの考えを本当に感謝します!

34
RanLearns

はい、pushViewController:は、View Controllerのスタックを管理するNavigation Controller用です。一方、addChildViewController:は、「View Controller Containment」と呼ばれるiOS 5の機能の一部です。

この背後にある基本的な考え方は、View Controllerを独自の他のView Controllerに埋め込むことができるということです(たとえば、iPhoneアプリをiPadに移植する場合)。したがって、Navigation Controller、Split View Controllerなどの独自の実装を簡単に行うことができます。

表示するような実装の問題の1つは、ビューのみを処理することです。方向の変更などのView Controllerイベントは、階層を適切に下に渡されません。 View Controllerの封じ込めでは、含まれているすべてのView Controllerも適切なメッセージを取得するようにします。

実装を見て、これによって本当に達成したいことについても考える必要があります。 Navigation Controllerは正しい場合もあれば、次のコントローラーをモーダルで表示する場合もあります( https://developer.Apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PresentingaViewController.html を参照)これらのメソッド(ナビゲーションコントローラーやモーダルビューなど)を使用する場合、ユーザーは既にこれらのナビゲーション手法に精通しています。

いずれにせよ https://developer.Apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ は、View Controller間の移行方法についての良い読み物です。

View Controllerのコンテインメントを使用する場合、基本的には通常どおりビューをContainingビューに追加する必要があります(これは、コントローラが追加された場合でも実行する必要があります)。次に、addChildViewController:を使用して、子View Controllerを周囲のControllerに追加します。また、didMoveToParentViewController:で子コントローラーに通知する必要があります。これは、別のコントローラーに配置されたことを示します。また、transitionFromViewController:toViewController:を使用して、あるView Controllerを別のView Controllerと交換し、オプションでアニメーションを与えることもできます。

73