概念
多控制器
:
当有很多控制器
,
交给一个大控制器管理
父子控制器:导航控制器,UITabBarController
父子控制器本质
:
搞一个控制器容器
,
管理很多子控制器
.
模仿UITabBarController,写一个自己的UITabBarController,条在上面.
任何控制器都可以是一个容器控制器.因为任何控制器都可以调用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];
把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];
[ super viewDidLoad];
// 1.
添加子控制器
[
self
setUpAllChildViewController];
// 2.设置按钮标题
[selfsetUpButtonTitle];
// 2.设置按钮标题
[selfsetUpButtonTitle];
}
//
添加子控制器
- ( void )setUpAllChildViewController
- ( 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;
{
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];
}
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];
// 获取之前控制器的 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];
}