13.控制器的父子关系

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值