1.控制器父子关系的建立原则
- 1.1 如果2个控制器的view是父子关系(不管是直接还是间接的父子关系),那么这2个控制器也应该为父子关系
[a.view addSubview:b.view];
[a addChildViewController:b];
// 或者
[a.view addSubview:otherView];
[otherView addSubbiew.b.view];
[a addChildViewController:b];
- 1.2 获得所有的子控制器
//通过该属性获得获得所有的子控制器
@property(nonatomic,readonly) NSArray *childViewControllers;
- 1.3 添加一个子控制器
//让OneViewController成为了self的子控制器
[self addChildViewController:[[OneViewController alloc] init]];
// 通过addChildViewController添加的控制器都会存在于childViewControllers数组中
- 1.4 获得父控制器
//通过该属性获得获得父控制器
@property(nonatomic,readonly) UIViewController *parentViewController;
- 1.5 将一个控制器从它的父控制器中移除
// 控制器a从它的父控制器中移除
[a removeFromParentViewController];
- 1.6 当需要监听一个控制器添加到某个父控制器(或当一个控制器从父控制器中移除时)时,处理逻辑操作,可以在
- (void)didMoveToParentViewController:(UIViewController *)parent
方法中监听处理。
//1. 当一个控制器从父控制器中移除时。会自动调用控制器的didMoveToParentViewController:方法,并且参数是nil
- (void)didMoveToParentViewController:(UIViewController *)parent
{
[super didMoveToParentViewController:parent];
NSLog(@"didMoveToParentViewController - %@", parent);
}
//2.当子控制器是由系统维护添加的(如storyboard中添加的子控制器)则子控制器已经被添加到父控制器上时就会调用
- (void)didMoveToParentViewController:(UIViewController *)parent
{
[super didMoveToParentViewController:parent];
NSLog(@"didMoveToParentViewController - %@", parent);
},
若子控制器是通过调用`[self addChildViewController:[[OneViewController alloc] init]]`添加到父控制器上时,系统不会自动调用`didMoveToParentViewController`方法,如要调用则要自己显示调用[self.childViewControllers[0] didMoveToParentViewController:self],系统才会调用
didMoveToParentViewController方法。
注意
当在AViewController的view上添加BViewController的view时,设置BViewController的view的frame后,发现BViewController的view不显示,可能需要设置BViewController.view.autoresizingMask = UIViewAutoresizingNone;
// 默认情况下,所有控制器view的autoresizingMask属性都包含了UIViewAutoresizingFlexibleWidth和UIViewAutoresizingFlexibleHeight两个值(宽度和高度可伸缩)
OneViewController *one = [[OneViewController alloc] init];
one.view.frame = CGRectMake(20, 100, 100, 100);
one.view.autoresizingMask = UIViewAutoresizingNone;
[self.view addSubview:one.view];
[self addChildViewController:one];
因为默认加载xib时 self.view == 600x600当加载后,view会放大或缩小,设置one.view == 100x100 --> 缩小x增大。