容器控制器(父子控制器)

#import "ViewController.h"

#import 

#import "SocietyViewController.h"
#import "TopLineViewController.h"
#import "HotViewController.h"

/*
    多控制器:当有很多控制器,交给一个大控制器管理
    父子控制器:导航控制器,UITabBarControler
    父子控制器本质:搞一个控制器容器,管理很多子控制器.
 
    模仿UITabBarControler,写一个自己的UITabBarControler,条在上面.
 
    任何控制器都可以是一个容器控制器.因为任何控制器都可以调用addChildViewController
 
    // UITabBarControler使用步骤
    // 1.显示UITabBarControler
    // 2.添加子控制器
 
    // ViewController
 */

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *titleView;

@property (weak, nonatomic) IBOutlet UIView *contentView;

@end

@implementation ViewController
- (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;
    
    // 添加子控制器的View
    [self.contentView addSubview:vc.view];

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

// 父子控制器:如果A控制器的view添加到B控制器的view,A控制器就要成为B控制器子控制器

// 父子控制器:如果一个控制器的view显示,那么这个控制器必须存在
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 1.添加子控制器
    [self setUpAllChildViewController];
    // 2.设置按钮标题
    [self setUpButtonTitle];
}
// 设置按钮标题
- (void)setUpButtonTitle
{
    NSUInteger count = self.titleView.subviews.count;
    // 3
    // 0 1 2
    for (int i = 0; i < count; i++) {
        
        UIButton *btn = self.titleView.subviews[i];
        UIViewController *vc = self.childViewControllers[i];
        [btn setTitle:vc.title forState:UIControlStateNormal];
    }
}
// 添加子控制器
- (void)setUpAllChildViewController
{
    // 社会
    SocietyViewController *societyVc = [[SocietyViewController alloc] init];
    societyVc.title = @"社会";
    [self addChildViewController:societyVc];
    
    // 头条
    TopLineViewController *topLine = [[TopLineViewController alloc] init];
    topLine.title = @"头条";
    [self addChildViewController:topLine];
    
    // 热点
    HotViewController *hotVc = [[HotViewController alloc] init];
    hotVc.title = @"热点";
    [self addChildViewController:hotVc];
}

@end```

![superAndSonViewController.gif](http://upload-images.jianshu.io/upload_images/189984-ec69ca3e46ea3b80.gif?imageMogr2/auto-orient/strip)

你可能感兴趣的:(容器控制器(父子控制器))