#import "ViewController.h"
#import "ScoietyViewController.h"
#import "HotViewController.h"
#import "TopLineViewController.h"
/*
父子控制器:多控制器管理:导航控制器,UITabBarController
默认UITabBarController,实现这种效果,父子实战
永远只会显示一个view,把之前的view移除
UITabBarController有个专门存放子控制器view,占位视图思想,1.不用去考虑子控制器的view尺寸 2.屏幕适配也不用管理
实现:
1.添加所有子控制器:addChildViewController
2.设置对应按钮的内容,按钮内容由对应子控制器:
NSInteger count = self.titleContainView.subviews.count;
for (int i = 0; i < count; i++) {
UIButton *btn = self.titleContainView.subviews[i];
UIViewController *vc = self.childViewControllers[i];
[btn setTitle:vc.title forState:UIControlStateNormal];
}
3:添加子控制器的view:1:先移除当前添加的view 2:再添加新的view,设置frame 方法:1:可以属性定义一个currentView,来记录当前的view,也可以直接遍历子控件数组,调用数组的方法:[self.containView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];来实现view的移除操作。再添加新的view的时候,从子控制器数组根据index取出当前点击的控制器,将其view添加到父控制器的view上。
4:1:当一些业务逻辑比较复杂的时候,就将此业务逻辑交给控制器来处理,当两个view互为父子关系的时候,他们的控制器也最好为父子关系 ,当两个控制器互为父子关系后,实现push或是diss等方法的时候,在子控制器中实现点击方法,系统会首先判断子控制器能否实现,有没有当前的导航控制器或是是否是当前modal出来的控制器,如果不是,就会向其父类中查找,直到找不到父类为止 ,找到父类后,父类就会实现相应的方法(push diss例子) ,互为父子关系的时候,则其就会有一个强引用,将子控制器会被存放到子控制器数组中,子控制器和view都会被强引用。 2:makeObjectsPerformSelector,数组的方法,遍历数组每个元素去执行某个方法。
3:常用的就是从子控件数组或是从子控制器的数组中根据index取出子控件或是子控制器的,可以调用get方法取出设置的子控件或是子控件view的值去给其他赋值,或是移除currentView,再添加新的view,设置新view的frame
*/
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *titleContainView;
@property (weak, nonatomic) IBOutlet UIView *containView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 1.添加所有的子控制器
[self setupAllViewController];
// 2.设置按钮的内容
[self setupTitleButton];
}
// 设置按钮的内容
- (void)setupTitleButton
{
NSInteger count = self.titleContainView.subviews.count;
for (int i = 0; i < count; i++) {
UIButton *btn = self.titleContainView.subviews[i];
UIViewController *vc = self.childViewControllers[i];
[btn setTitle:vc.title forState:UIControlStateNormal];
}
}
// 添加所有的子控制器
- (void)setupAllViewController
{
// 社会
ScoietyViewController *scoietyVc = [[ScoietyViewController alloc] init];
scoietyVc.title = @"社会";
[self addChildViewController:scoietyVc];
// 头条
TopLineViewController *topLineVc = [[TopLineViewController alloc] init];
topLineVc.title = @"头条";
[self addChildViewController:topLineVc];
// 热点
HotViewController *hotVc = [[HotViewController alloc] init];
hotVc.title = @"热点";
[self addChildViewController:hotVc];
}
// 点击标题按钮
- (IBAction)showChildVcView:(UIButton *)sender {
// 移除之前控制器的view
[self.containView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
// for (UIView *vcView in self.containView.subviews) {
// [vcView removeFromSuperview];
// }
// 把对应子控制器的view添加上去
UIViewController *vc = self.childViewControllers[sender.tag];
vc.view.backgroundColor = sender.backgroundColor;
vc.view.frame = self.containView.bounds;
[self.containView addSubview:vc.view];
}
@end