Build relationship between Parent&Child VC

参考资料链接

两个ViewController 之间的父子关系模式

  • 父VC:parent ViewController,以下简称pVC
  • 子VC:child ViewController,以下简称cVC

综述

  • 实现一个Custom Container View Controller并不是一个简单的事情,主要分为两个阶段:父子关系的建立以及父子关系的解除。如果pVC将cVC的view添加为自己的subview,那么cVC必须为pVC的Child View Controller,

  • 另一些如navigation 或 tabbar ,不是通过上面的这种方式建立关系。
    比如UINavigationController,一个View Controller被push进来后便和navigationController建立父子关系了,但是只有最上面的View Controller 是显示着的,底下的View Controller的view则被移出了容器的view的显示层级,当一个View Controller被pop之后,便和navigationController解除了父子关系了。

下面来介绍以下建立/解除 VC之间父子关系

建立

假设 cVC是下面代码中的self.centerViewController

  1. addChildViewController:接口建立了逻辑上的父子关系,子可以通过.parentViewController,访问其pVC,addChildViewController:接口的逻辑中会自动调用 [content willMoveToParentViewController:self];
  2. 建立父子关系后,便是将cVC的view加入到pVC的view hierarchy上,同时要决定的是 content的view显示的区域范围。此时pVC只是一个容器,cVC占据了他的边界
  3. 调用child的 didMoveToParentViewController: ,以通知child,完成了父子关系的建立 这步操作很重要!!
    [self addChildViewController:self.centerViewController];
    self.centerViewController.view.frame = self.view.bounds;
    [self.view addSubview:self.centerViewController.view];
    [self.centerViewController didMoveToParentViewController:self];

解除

  1. 通知child,即将解除父子关系,从语义上也可以看出 child的parent即将为nil
  2. 将child的view从父VC的view的hierarchy中移除
  3. 通过removeFromParentViewController的调用真正的解除关系,removeFromParentViewController会自动调用 [content didMoveToParentViewController:nil]
[content willMoveToParentViewController:nil]; //1 
[content.view removeFromSuperview];           //2 
[content removeFromParentViewController];     //3 

最后附上一个总结表:

函数名 执行方 AUTO / Manual
willMoveToParentViewController cVC 执行 AUTO
addChildViewController pVC执行 MANUAL
didMoveToParentViewController cVC 执行 MANUAL
willMoveToParentViewController cVC执行 MANUAL
removeFromParentViewController pVCt执行 MANUAL
didMoveToParentViewController cVC执行 AUTO

你可能感兴趣的:(Build relationship between Parent&Child VC)