UIViewController之[自定义容器视图控制器]

1.简介

Container的主要职责就是管理一个或多个Child View Controller的展示的生命周期,需要传递显示以及旋转相关的回调

一个app首先有一个主window,window指定一个rootViewController

window会将相关的回调传递给rootViewController

rootViewController需要再将这些callbacks的调用传递给它的Child View Controllers

显示相关的回调:appearance callbacks(
          viewWillAppear:
          viewWillDisappear:
          viewDidAppear:
          viewDidDisappear: 
)
旋转相关的回调:rotation callbacks(
          willRotateToInterfaceOrientation:duration: 
          willAnimateRotationToInterfaceOrientation:duration:,
          didRotateFromInterfaceOrientation:
)

2.父子关系(parentViewController--subViewController)

实现一个Custom Container View Controller分为两个阶段

①父子关系的建立

②️父子关系的解除
2.1建立父子关系
    //将subViewController添加为child view controller,addChildViewController:接口建立了逻辑上的父子关系
    //子可以通过parentViewController,访问其父VC
    //addChildViewController:接口的逻辑中会自动调用 [subViewController willMoveToParentViewController : parentViewController]; 
    [parentViewController addChildViewController : subViewController];

    //建立父子关系后,便是将content的view加入到父VC的view hierarchy(层次结构)上
    [parentViewController.view addSubview : subViewController.view];

    //调用child的 didMoveToParentViewController: ,以通知child,完成了父子关系的建立
    [subViewController didMoveToParentViewController : parentViewController];
2.2解除父子关系
    //通知child,即将解除父子关系
    [self willMoveToParentViewController:nil];

    //将child的view从父VC的view的hierarchy中移除
    [self.view removeFromSuperview];

    //通过removeFromParentViewController的调用真正的解除关系
    //removeFromParentViewController会自动调用 [content didMoveToParentViewController:nil]
    [self removeFromParentViewController];

3. appearance callbacks的传递

生命周期:

alloc -> initWithNibName -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidDisappear -> dealloc

其实,callbacks系统会自动调用,但是有些需求自动调用不能满足需求,如:

child view的展示有一个动画的过程,这个时候我们并不想viewDidAppear的调用在addSubview的时候进行,而是等展示动画结束后再调用viewDidAppear。

自定义容器中需要关闭自动调用callbacks,自己去控制callbacks的调用时机

3.1如何关闭自动传递:
    IOS5: automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
        return NO;
    IOS6+:shouldAutomaticallyForwardAppearanceMethods
        return NO;
3.2手动传递

手动传递需要用到一下两个方法, 而且必须成对出现

beginAppearanceTransition:animated:

endAppearanceTransition
    //触发subViewController的viewWillAppear
    [subViewController beginAppearanceTransition:YES animated:animated];           
    
    //触发subViewController的viewWillDisappear
    [subViewController beginAppearanceTransition:NO animated:animated];

    //触发对应的viewDidAppear和viewDidDisappear
    [subViewController endAppearanceTransition];
例子
/**
*将subViewController添加入parentViewController中
*调用该方法后,可以添加子控制器显示时的动画效果
*/
-(void)addToParentViewContoller:(UIViewController *)parentViewController subViewController:(UIViewController*)subViewController{
    [subViewController beginAppearanceTransition:YES animated:animated]; 

    [parentViewController addChildViewController : subViewController];
    [parentViewController.view addSubview : subViewController.view];
    [subViewController didMoveToParentViewController : parentViewController];

    [subViewController endAppearanceTransition];     
}

/**
* 将subViewController从parentViewController中删除
*/
-(void)removeFromParentViewContoller:(UIViewController *)parentViewController subViewController:(UIViewController*)subViewController{
    [subViewController beginAppearanceTransition:NO animated:animated]; 

    [subViewController willMoveToParentViewController:nil];
    [subViewController.view removeFromSuperview];
    [subViewController removeFromParentViewController];

    [subViewController endAppearanceTransition];     
}

4. rotation callbacks的传递

转屏时才会需要关注的问题

4.1如何关闭自动传递:
    IOS5: automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers
        return NO;
    IOS6+:shouldAutomaticallyForwardRotationMethods
        return NO;

转屏时触发的函数:请参照如下链接:

转屏时触发函数 http://my.oschina.net/u/2462423/blog/523235#OSC_h3_6

更多详细内容请参照如下链接:

更多详细内容 http://www.cocoachina.com/industry/20140523/8528.html

转载于:https://my.oschina.net/u/2462423/blog/531997

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值