IOS willMoveToParentViewController和didMoveToParentViewController的使用

在iOS 5.0及以后,iOS为UIViewController类添加了新的属性和方法:


1

2

3

4

5

6

@property(nonatomic,readonly) NSArray *childViewControllers

- (void)addChildViewController:(UIViewController *)childController

- (void)removeFromParentViewController

- (void)transitionFromViewController::::::

- (void)willMoveToParentViewController:(UIViewController *)parent

- (void)didMoveToParentViewController:(UIViewController *)parent

这样,就能够将一个页面中的UIViewController控制起来,而不是混乱的共用一个UIViewController,最重要的是,编程习惯的革命:降低了功能的耦合度!

这里看看这几个方法的使用:

一、[父视图控制器 addChildViewController:子视图控制器];

在此,图控制器A添加了另一个图控制器B,那么A充当父视图控制器,B充当子视图控制器。父视图控制器充当了视图控制器容器的角色。

1、addChildViewController方法:


1

- (void)addChildViewController:(UIViewController *)childController

向视图控制器容器中添加子视图控制器

childController:子视图控制器

当要添加的子视图控制器已经包含在视图控制器容器中,那么,相当于先从父视图控制器中删除,然后重新添加到父视图控制器中。

2、removeFromParentViewController 方法


1

- (void)removeFromParentViewController

从父视图控制器中删除。

3、transitionFromViewController 方法


1

- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

交换两个子视图控制器的位置(由于添加的顺序不同,所以子试图控制器在父视图控制器中存在层次关系)

fromViewController:当前显示的子试图控制器,将被替换为非显示状态

toViewController:将要显示的子视图控制器

duration:交换动画持续的时间,单位秒

options:动画的方式

animations:动画Block

completion:完成后执行的Block

4、willMoveToParentViewController 方法


1

- (void)willMoveToParentViewController:(UIViewController *)parent

当一个视图控制器从视图控制器容器中被添加或者被删除之前,该方法被调用parent:父视图控制器,如果没有父视图控制器,将为nil

注意点:

  1. 当我们向我们的视图控制器容器中调用removeFromParentViewController方法时,必须要先调用该方法,且parent参数为nil:

    [将要删除的视图控制器 willMoveToParentViewController:nil];

  2. 当我们调用addChildViewController方法时,在添加子视图控制器之前将自动调用该方法。所以,就不需要我们显示调用了。

5、didMoveToParentViewController 方法


1

- (void)didMoveToParentViewController:(UIViewController *)parent

当从一个视图控制容器中添加或者移除viewController后,该方法被调用。

parent:父视图控制器,如果没有父视图控制器,将为nil

当我们向我们的视图控制器容器(就是父视图控制器,它调用addChildViewController方法加入子视图控制器,它就成为了视图控制器的容器)中添加(或者删除)子视图控制器后,必须调用该方法,告诉iOS,已经完成添加(或删除)子控制器的操作。

removeFromParentViewController 方法会自动调用了该方法,所以,删除子控制器后,不需要在显示的调用该方法了。

其实,这几个方法中的API说明,看的还懂。

二、关于willMoveToParentViewController方法和didMoveToParentViewController方法的使用

1.这两个方法用在子试图控制器交换的时候调用!即调用transitionFromViewController 方法时,调用。

2.当调用willMoveToParentViewController方法或didMoveToParentViewController方法时,要注意他们的参数使用:

当某个子视图控制器将从父视图控制器中删除时,parent参数为nil。

即:[将被删除的子试图控制器 willMoveToParentViewController:nil];

当某个子试图控制器将加入到父视图控制器时,parent参数为父视图控制器。

即:[将被加入的子视图控制器 didMoveToParentViewController:父视图控制器];

3.无需调用[子视图控制器 willMoveToParentViewController:父视图控制器]方法。因为我们调用[父视图控制器 addChildViewController:子视图控制器]时,已经默认调用了。

只需要在transitionFromViewController方法后,调用[子视图控制器didMoveToParentViewController:父视图控制器];

4.无需调用[子视图控制器 didMoveToParentViewController:父视图控制器]方法。因为我们调用

[子视图控制器 removeFromParentViewController]时,已经默认调用了。

只需要在transitionFromViewController方法之前调用:[子视图控制器 willMoveToParentViewController:nil]。

时间: 2024-08-09 02:09:29

IOS willMoveToParentViewController和didMoveToParentViewController的使用的相关文章

willMoveToParentViewController和didMoveToParentViewController

willMoveToParentViewController和didMoveToParentViewController iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewController 在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView 在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候被盖

UIViewController 中的 willMoveToParentViewController和didMoveToParentViewController的使用(转载)

原文:http://www.gowhich.com/blog/543 关于这两个方法,也是IOS5之后才加上去的. 在iOS 5.0及以后,iOS为UIViewController类添加了新的属性和方法: @property(nonatomic,readonly) NSArray *childViewControllers - (void)addChildViewController:(UIViewController *)childController - (void)removeFromPa

ViewController容器

在我的一个项目中,我需要实现一种容器式的 view controller.我感觉几乎是寸步难行,因为这种技术用的人是那么的少.因为很显然,开发者更喜欢重用和利用已有的view controller,而不是发明新的容器. 但是在某些情况下你更需要定制自己的容器.比起UINavigationController 和 UITabBarController,自己的容器更能简化你的代码.想起你什么时候以及什么情况下会使用这两个控制器吗? 我很容易就想到一个例子.当你想用 view controller 去

Containing ViewControllers

Containing ViewControllers 转自:https://www.cocoanetics.com/2012/04/containing-viewcontrollers/ For a project that I am currently working on I needed to implement a custom container view controller. I was feeling my way forward in the dark for the most

iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon

在iOS 5.0以前,我们在一个UIViewController中这样组织相关的UIView 在以前,一个UIViewController的View可能有很多小的子view.这些子view很多时候被盖在最后,我们在最外层ViewController的viewDidLoad方法中,用addSubview增加了大量的子view.这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等.但是虽然这些view很少出

iOS开发>学无止境 - Cell 里的视图控制器

在每个 iOS 开发者的生涯中,总有一些时候想把一个视图控制器放到一个 tableView 的 cell 中.因为这是一个有用的工具去处理我在视图控制器中的各种复杂视图及繁琐操作,而且很容易想象的一种情况是你想要将一些视图堆在另一些视图上面.另一个常见的应用场景是将 collectionView 放在 cell 里.理想情况下里面的 collectionView 拥有它自己的控制器,这样外面的 tableView 控制器不会受到关联视图和每个 collection view cell 数据的影响

iOS学习笔记——使用ChildViewController

之前在使用TableView的时候遇到过问题,需要使用另外的TableViewController来先存放TableView,原有的View则使用ViewContainer来引用TableViewController.此时是第一回接触一个ViewController中使用另一个ViewController.后来在开发的时候遇到另外的问题也需要用到ChildViewController,本来这类问题可以使用自定义的View来解决.在开发Android的时候自定义的View可以指定用某个布局文件,但

ios 开发日记 13-剖析网易新闻标签栏视图切换(addChildViewController属性介绍)

iOS开发 剖析网易新闻标签栏视图切换(addChildViewController属性介绍) 时间 2014-06-25 21:45:21  CSDN博客 原文  http://blog.csdn.net/hmt20130412/article/details/34523235 主题 网易iOS开发 本来只是打算介绍一下addChildViewController这个方法的,正好今天朋友去换工作面试问到网易新闻标签栏效果的实现,就结合它,用个小Demo实例介绍一下:(具体解释都写在了Demo里

iOS中的转场研究(转)

http://mikixiyou.iteye.com/blog/1745995 http://www.cocoachina.com/ios/20141113/10212.html 在iOS开发中,segue用来实现storyboard中源视图控制器和目标视图控制器连接,当segue被触发时,系统将完成下列操作: 1.实例化目标视图控制器2.实例化一个新segue对象,该对象持有所有的信息3.调用源视图控制器的prepareForSegue:sender:方法,4.调用segue的 perform