父子控制器

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


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


初步实现 
- (IBAction)showFirstView:(id)sender {
   
    if (_firstVc == nil) {
       
        FirstViewController *topLine = [[FirstViewController 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 = [[ModelViewController alloc] init];
[self.view addSubview:modelVc.view];
 modelVc成为自己的子控制器
[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
{
    // 首页
    FirstViewController *societyVc = [[FirstViewController alloc] init];
    firstVc.title = @“首页";
    [self addChildViewController:firstVc];
   
    // 第二页
    SecondViewController *secondVc = [[SecondViewController alloc] init];
    secondVc.title = @“第二页";
    [self addChildViewController:secondVc];
   
    // 第三页
    ThirdController *thirdVc = [[ThirdViewController 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];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值