13.控制器的父子关系

来源:互联网 发布:mac添加农历 编辑:程序博客网 时间:2024/06/11 02:45

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增大。
0 0
原创粉丝点击