34

WWDC「UIViewControllerContainmentの実装」に関する2011年のプレゼンテーションを見たばかりです(ここにビデオへのリンクがあります

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

addChildViewController /
removeFromParentViewController @property(nonatomic、readonly)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」の正しい使用方法は何でしょうか。

この件についてのあなたの考えに本当に感謝します!

4

1 に答える 1

73

はい、pushViewController:ビュー コントローラーのスタックを管理するナビゲーション コントローラー用です。addChildViewController:一方、「ビュー コントローラー コンテインメント」と呼ばれる iOS 5 機能の一部です。

この背後にある基本的な考え方は、ビュー コントローラーを独自の他のビュー コントローラーに埋め込むことができ (iPhone アプリを iPad に移植する場合など)、ナビゲーション コントローラー、分割ビュー コントローラーなどの独自の実装を簡単に行うことができるということです。

あなたが示したような実装の問題の1つは、ビューのみを処理することです。向きの変更などのビュー コントローラー イベントは、階層を適切に下に渡されません。ビュー コントローラーのコンテインメントは、含まれているすべてのビュー コントローラーも適切なメッセージを取得できるようにします。

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

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

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

于 2011-11-10T18:07:13.080 に答える