美文网首页程序员
addChildViewController讲解(一)

addChildViewController讲解(一)

作者: 晓飞90 | 来源:发表于2016-11-21 17:02 被阅读928次

    参考:http://blog.devtang.com/2012/02/06/new-methods-in-uiviewcontroller-of-ios5/

    1. addChildViewController的由来

    在苹果的WWDC2011大会视频的 《Session 101 - What’s New in Cocoa》 和 《Session 102 - Implementing UIViewController Containment》 中介绍了苹果在iOS5中给UIViewController新增加的5方法以及一个属性:

    // 方法
    addChildViewController:
    removeFromParentViewController:
    transitionFromViewController:toViewController:duration:options:animations:completion:
    willMoveToParentViewController:
    didMoveToParentViewController:
    
    // 属性
    @property(nonatomic,readonly) NSArray *childViewControllers
    

    原来的问题

    这些新增的方法和属性用于改进我们的编程方式。那么让我们先看看以前的对于UIViewController的使用有什么潜在的问题,认清问题,我们才能理解苹果改变的意义。

    在以前,一个UIViewController的View可能有很多小的子view。这些子view很多时候被盖在最后,我们在最外层ViewController的viewDidLoad方法中,用addSubview增加了大量的子view。这些子view大多数不会一直处于界面上,只是在某些情况下才会出现,例如登陆失败的提示view,上传附件成功的提示view,网络失败的提示view等。但是虽然这些view很少出现,但是我们却常常一直把它们放在内存中。另外,当收到内存警告时,我们只能自己手工把这些view从super view中去掉。


    改变

    苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去。需要显示时再调用transitionFromViewController:toViewController:duration:options:animations:completion方法。

    另外,当收到系统的Memory Warning的时候,系统也会自动把当前没有显示的subview unload掉,以节省内存。

    Posted by 唐巧 Feb 6th, 2012 iOS


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

    注意点:

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

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

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

    didMoveToParentViewController 方法
    

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

    -(void)didMoveToParentViewController:(UIViewController *)parent
    parent:父视图控制器,如果没有父视图控制器,将为nil
    

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

    4.关于willMoveToParentViewController方法和didMoveToParentViewController方法的使用

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

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

      当某个子视图控制器将从父视图控制器中删除时,parent参数为nil。即:[将被删除的子试图控制器 willMoveToParentViewController:nil];

    当某个子试图控制器将加入到父视图控制器时,parent参数为父视图控制器。即:[将被加入的子视图控制器 didMoveToParentViewController:父视图控制器];


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

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


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

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

    相关文章

      网友评论

        本文标题:addChildViewController讲解(一)

        本文链接:https://www.haomeiwen.com/subject/pemupttx.html