關(guān)乎父子控制器,多數(shù)APP都采用了類似方式,原理是將多個(gè)子控制器存放在大的父級(jí)控制器里邊,通過滑動(dòng)或者點(diǎn)擊,將制定的子控制器顯示在當(dāng)前的UIWindows上,代表性的有今日頭條,網(wǎng)易新聞等.
今日頭條將"國(guó)際"/"段子"/"趣圖"/"財(cái)經(jīng)"等子控制器塞在了當(dāng)前的控制器,并呈現(xiàn)給讀者

請(qǐng)注意綠色部分
實(shí)現(xiàn)步驟
1.確定好目錄結(jié)構(gòu)

Paste_Image.png
2.在父控制器中實(shí)現(xiàn)方法

Paste_Image.png

Paste_Image.png
主要代碼
#import "ViewController.h"
#import "OneViewController.h"
#import "TwoViewController.h"
#import "ThreeViewController.h"
@interface ViewController ()
//當(dāng)前控制器
@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];
//先后順序不要搞混,那個(gè)拍前邊就寫前邊
[self addChildViewController:self.oneVc];
[self addChildViewController:self.twoVc];
[self addChildViewController:self.threeVc];
//默認(rèn)選擇第一個(gè)子控制器
[self clickMenu:nil];
}
- (IBAction)clickMenu:(UIButton *)btn {
// 取出選中的這個(gè)控制器
//寫法一:
//UIViewController *oneVc = self.childViewControllers[0];
//寫法二:
self.oneVc = (OneViewController *)self.childViewControllers[0];
// 設(shè)置尺寸位置
self.oneVc.view.frame = CGRectMake(0, 70, self.view.frame.size.width, self.view.frame.size.height - 50);
// 移除掉當(dāng)前顯示的控制器的view(移除的是view,而不是控制器)
[self.currentVC.view removeFromSuperview];
// 把選中的控制器view顯示到界面上
[self.view addSubview:self.oneVc.view];
self.currentVC = self.oneVc;
}
3.傳值為nil解決方法

Paste_Image.png
簡(jiǎn)單的說,只要涉及到取值,全部使用寫法二的方式,就可以避免傳值為nil,否則項(xiàng)目跟block聯(lián)合調(diào)用,就無法分清是block循環(huán)導(dǎo)致傳值為nil,還是因?yàn)榭刂破鳠o法明晰主從關(guān)系導(dǎo)致的傳值為nil,這一點(diǎn)切記.