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