父子控制器

概念 
多控制器 : 当有很多控制器 , 交给一个大控制器管理
父子控制器 : 导航控制器 ,UITabBarControler
父子控制器本质 : 搞一个控制器容器 , 管理很多子控制器 .
模仿 UITabBarControler, 写一个自己的 UITabBarControler, 条在上面 .
任何控制器都可以是一个容器控制器 . 因为任何控制器都可以调用 addChildViewController


问题 
控制器的 view , 控制器被销毁 .
控制器不存在 , 控制器的 view 也是可以存在
当控制器 view 存在 , 控制器不存在 , 会导致控制器 view 上面的所有事件都不能处理
( 父子控制器 : 如果一个控制器的 view 显示 , 那么这个控制器必须存在 )
ARC 管理原则 : 只要一个对象没有被强引用 , 就会被销毁


初步实现 
- ( IBAction )showFirstView:( id )sender {
   
    if ( _firstVc == nil ) {
       
        First ViewController *topLine = [[ First ViewController alloc] init];
        _firstVc = topLine;
     
    }
    [ self .view addSubview: _firstVc .view];
   
    // 移除其他控制器的 view
    [ _secondVc .view removeFromSuperview];
    [ _thirdVc .view removeFromSuperview];
}


好处
一 
父子控制器设计原理 : 只要 A 控制器的 view 成为 B 控制器 view 的子控件 , 那么 A 控制器就要成为 B 控制器子控制器
self.navigationController: 首先去寻找自己是不是导航控制器子控制器
就会去看自己的父控制是不是导航控制器子控制器

"ViewController.m"
创建控制器  
PushViewController *pushVc = [[ PushViewController alloc] init];
UIViewController *vc = [[ UIViewController alloc] init];
[ self .view addSubview:pushVc.view];
  pushVc 成为自己的子控制器
[ self addChildViewController:pushVc];
[pushVc.navigationController  pushViewController:vc animated: YES ];   //可以实现

“PushViewController.m"
  创建控制器
  PushViewController *pushVc = [[ PushViewController alloc] init];
  [ self .view addSubview:pushVc.view];
[pushVc.navigationController  pushViewController:vc animated: YES ]; // 不能实现

"ViewController.m"
ModelViewController *modelVc = [[ Model ViewController alloc] init];
[ self .view addSubview:modelVc.view];
  model Vc 成为自己的子控制器
[ self addChildViewController:modelVc];
[ self presentViewController: modelVc animated: YES completion:^{}];

"ModalViewController.m"
  创建控制器
  DismissViewController *dismissVc = [[ DismissViewController alloc] init];
[ self .view addSubview:dismissVc.view];
[ self addChildViewController:dismissVc];

"DismissViewController.m"
- ( void )touchesBegan:( NSSet < UITouch *> *)touches withEvent:( UIEvent *)event
{     NSLog( @"%s" , __func__ );
    // dismissViewControllerAnimated: 谁调用 ,dismiss
    // 首先会判断下自己是不是 modal 出来
     // 如果不是 modal 出来的,会去找父控制器有没有 Modal, 如果 Modal, 就会 dismiss 父控制器
    [ self dismissViewControllerAnimated: YES completion: nil ];
}


实现 
模仿 UITabBarControler, 写一个自己的 UITabBarControler, 条在上面 .
任何控制器都可以是一个容器控制器 . 因为任何控制器都可以调用 addChildViewController
UITabBarControler 使用步骤
1. 显示 UITabBarControler
2. 添加子控制器

"ViewController.h"

- ( void )viewDidLoad
{
    [ super viewDidLoad];
      // 1. 添加子控制器
    [ self setUpAllChildViewController ];
    // 2. 设置按钮标题
    [ self setUpButtonTitle ];
}



// 添加子控制器
- ( void )setUpAllChildViewController
{
    // 首页
    First ViewController *societyVc = [[ First ViewController alloc] init];
    firstVc.title = @“ 首页 " ;
    [ self addChildViewController:firstVc];
   
    // 第二页
    Second ViewController *secondVc = [[ Second ViewController alloc] init];
    secondVc.title = @“ 第二页 " ;
    [ self addChildViewController:secondVc];
   
    // 第三页
    Third Controller *thirdVc = [[ Third ViewController alloc] init];
    thirdVc.title = @“第三页 " ;
    [ self addChildViewController:thirdVc];
}



// 设置按钮标题  (3个button添加在 self . titleView 上)
- ( void )setUpButtonTitle
{
    NSUInteger count = self . titleView .subviews.count;
  
    for ( int i = 0; i < count; i++) {
       
        UIButton *btn = self . titleView .subviews[i];
        UIViewController *vc = self .childViewControllers[i];
        [btn setTitle:vc.title forState:UIControlStateNormal];
    }
}


3个button点击的实现方法
- ( IBAction )showVc:( UIButton *)sender {
   
    // 获取之前控制器的 view
    UIView *firstView;
    if ( self . contentView .subviews.count) {
       firstView  = self . contentView .subviews[0];
   }

    // 显示子控制器
    UIViewController *vc = self .childViewControllers[sender.tag];
    vc.view.frame = self . contentView .bounds;
    [ self . contentView addSubview:vc.view];

    // 移除之前控制器的 view
    [firstView removeFromSuperview];
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值