关乎父子控制器,多数APP都采用了类似方式,原理是将多个子控制器存放在大的父级控制器里边,通过滑动或者点击,将制定的子控制器显示在当前的UIWindows上,代表性的有今日头条,网易新闻等.
今日头条将"国际"/"段子"/"趣图"/"财经"等子控制器塞在了当前的控制器,并呈现给读者

实现步骤
1.确定好目录结构

2.在父控制器中实现方法


主要代码
#import "ViewController.h"
#import "OneViewController.h"
#import "TwoViewController.h"
#import "ThreeViewController.h"
@interface ViewController ()
//当前控制器
@property (nonatomic, weak) UIViewController *currentVC;
//子控制器1
@property (nonatomic,strong)OneViewController *oneVc;
//子控制器2
@property (nonatomic,strong)TwoViewController *twoVc;
//子控制器3
@property (nonatomic,strong)ThreeViewController *threeVc;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.oneVc = [[OneViewController alloc]init];
self.twoVc = [[TwoViewController alloc]init];
self.threeVc = [[ThreeViewController alloc]init];
//先后顺序不要搞混,那个拍前边就写前边
[self addChildViewController:self.oneVc];
[self addChildViewController:self.twoVc];
[self addChildViewController:self.threeVc];
//默认选择第一个子控制器
[self clickMenu:nil];
}
- (IBAction)clickMenu:(UIButton *)btn {
// 取出选中的这个控制器
//写法一:
//UIViewController *oneVc = self.childViewControllers[0];
//写法二:
self.oneVc = (OneViewController *)self.childViewControllers[0];
// 设置尺寸位置
self.oneVc.view.frame = CGRectMake(0, 70, self.view.frame.size.width, self.view.frame.size.height - 50);
// 移除掉当前显示的控制器的view(移除的是view,而不是控制器)
[self.currentVC.view removeFromSuperview];
// 把选中的控制器view显示到界面上
[self.view addSubview:self.oneVc.view];
self.currentVC = self.oneVc;
}
3.传值为nil解决方法

简单的说,只要涉及到取值,全部使用写法二的方式,就可以避免传值为nil,否则项目跟block联合调用,就无法分清是block循环导致传值为nil,还是因为控制器无法明晰主从关系导致的传值为nil,这一点切记.
网友评论