概念
多控制器:当有很多控制器,交给一个大控制器管理
父子控制器:导航控制器,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];
}