Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

UIViewController のコンテナ機能

10,047 views

Published on

iOS 5 UIViewControllerのコンテナ機能。
第41回 Cocoa勉強会関西の発表資料。

Published in: Technology

UIViewController のコンテナ機能

  1. 1. UIViewControllerの コンテナ機能 2011.11.19 ふじしげ ゆういち @nakiwo
  2. 2. コンテナViewController •ViewControllerの入れ物になる ViewController •UINavigationController •UITabBarController •UISplitViewController
  3. 3. iOS 5 •自分でコンテナViewControllerを作る 事ができる新機能
  4. 4. @property UIViewController *parentViewController; @property NSArray *childViewControllers; - (void) addChildViewController: (UIViewController *)childController; - (void) removeFromParentViewController;
  5. 5. ViewViewController View
  6. 6. ViewViewController ViewViewController View
  7. 7. ViewViewController ViewViewController View iOS 4まで
  8. 8. ViewViewController ViewViewController View iOS 5 - (void) addChildViewController: (UIViewController *)childController;
  9. 9. 嬉しい点 • UIViewControllerの各種メソッドを適切に呼び 出してくれる。 viewWillAppear: viewDidAppear: viewWillDisappear: viewDidDisappear: willRotateToInterfaceOrientation:duration: willAnimateRotationToInterfaceOrientation:duration: didRotateFromInterfaceOrientation: etc..
  10. 10. ViewViewController ViewViewController View ViewViewController NG View階層をたどって最初に見つかる ViewControllerがparentViewControllerでない
  11. 11. ViewViewController ViewViewController View ViewContollerが親子関係にあるが Viewは親子関係にない、はOK (子を表示したくない場合) ViewViewController
  12. 12. •addChildViewControllerしても addSubViewはしてくれないので自分 でやる事
  13. 13. • parentViewControllerはiOS 4以前もある が、iOS 5で仕様が変わった。 • modalのparentViewControllerの扱い iOS 4以前 : modalを出したVC iOS 5 : nil • iOS 5 では modalと呼びたくないらしい • modalの親は presentingViewController
  14. 14. /* If this view controller is a child of a containing view controller (e.g. a navigation controller or tab bar controller,) this is the containing view controller. Note that as of 5.0 this no longer will return the presenting view controller. */ @property(nonatomic,readonly) UIViewController *parentViewController; // This property has been replaced by presentedViewController. // It will be DEPRECATED, plan accordingly. @property(nonatomic,readonly) UIViewController *modalViewController; // The view controller that was presented // by this view controller or its nearest ancestor. @property(nonatomic,readonly) UIViewController *presentedViewController __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0); // The view controller that presented // this view controller (or its farthest ancestor.) @property(nonatomic,readonly) UIViewController *presentingViewController __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
  15. 15. presentViewController:animated:completion: dismissViewControllerAnimated:completion:
  16. 16. - (BOOL)automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers; viewWillAppear: viewDidAppear: viewWillDisappear: viewDidDisappear: willRotateToInterfaceOrientation:duration: willAnimateRotationToInterfaceOrientation:duration: didRotateFromInterfaceOrientation:
  17. 17. - (void)willMoveToParentViewController: (UIViewController *)parent; - (void)didMoveToParentViewController: (UIViewController *)parent;
  18. 18. - (void)willMoveToParentViewController: (UIViewController *)parent; - (void)didMoveToParentViewController: (UIViewController *)parent; • addChildViewControllerは willMoveToParentViewControllerを呼んでくれる。 • removeFromParentViewControllerは didMoveToParentViewControllerを呼んでくれる。 • 呼んでくれない方は自分で呼ぶ必要がある。 • アニメーション無しの場合すぐに呼び出し。 • アニメーション有りの場合アニメーション完了後呼び出し。
  19. 19. - (void)transitionFromViewController: toViewController: duration: options: animations: completion: • viewControllerの入れ替えアニメーション • from/to両方があらかじめ 同じviewControllerの子になっている必要がある。 • fromのsuperviewにtoのviewがaddされる。 • fromのviewは剥がされる。 • viewControllerの親子関係はそのまま。
  20. 20. その他便利メソッド - (void)viewWillLayoutSubviews; - (void)viewDidLayoutSubviews; - (BOOL)isBeingPresented; - (BOOL)isBeingDismissed; - (BOOL)isMovingToParentViewController; - (BOOL)isMovingFromParentViewController; presentViewController:animated:completion: dismissViewControllerAnimated:completion:
  21. 21. Demo
  22. 22. ViewVC(left) rightContainerViewViewController デモの構成 ViewVC(right2) leftContainerView ViewVC(right1) ViewVC(MODAL) •right1,right2,leftは常に childViewController •MODALは一時的 childViewControllerとして登 場 •right1/right2はどちらかだけ view階層にいる •left/MODALはどちらかだけ view階層にいる
  23. 23. 注意点 • SDK提供のコンテナを子コントローラにする と面倒が多い。 wantsFullScreenLayoutとか • viewを貼っただけでviewWillAppearが呼ばれ る。 iOS 4までで自力で呼んでいた人注意
  24. 24. 参考資料 •クラスリファレンスとヘッダファイル ヘッダの方が詳しい事が多々 •WWDC11のビデオ •今日のサンプルコード https://github.com/nakiwo/ViewControllerContainerSample

×