1. 控制器View的創(chuàng)建
首先我們來(lái)看一下控制器view創(chuàng)建的流程圖
從圖中我們可以看出张抄,在控制器view加載過(guò)程中有兩個(gè)重要的方法loadView和viewDidLoad司浪。下面我們來(lái)重點(diǎn)了解一下這兩個(gè)方法荧关。
loadView方法
作用:loadView方法是用來(lái)負(fù)責(zé)創(chuàng)建UIViewController的view举户。首先判斷下有沒(méi)有指定storyboard或者xib,如果指定,就會(huì)加載它們描述的控制器的view,如果沒(méi)有指定,創(chuàng)建一個(gè)空的view蔼紧。
什么時(shí)候調(diào)用:每次訪問(wèn)UIViewController的view婆硬,當(dāng)view為nil,就會(huì)調(diào)用loadView方法奸例。
viewDidLoad
作用:一般我們會(huì)在這里做界面上的初始化操作彬犯,比如往view中添加一些子視圖等。
什么時(shí)候調(diào)用:每當(dāng)view創(chuàng)建完畢的時(shí)候查吊,最終都會(huì)調(diào)用viewDidLoad方法谐区。
其次,在view創(chuàng)建過(guò)程中還有一些需要注意的地方菩貌。
- 通過(guò)storyboard創(chuàng)建的控制器,或者通過(guò)xib創(chuàng)建的控制器的view重荠,系統(tǒng)會(huì)幫我們加載控制器的view箭阶,具體內(nèi)部實(shí)現(xiàn)可以看iOS-UIWindow詳解,在此不在贅述
-
ViewController *vc = [[ViewController alloc]init];
底層也會(huì)調(diào)用-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
方法戈鲁。
(1).判斷下有沒(méi)有指定nibName,如果指定了,就會(huì)去加載指定的xib
(2).如果沒(méi)有指定,就會(huì)判斷下有沒(méi)有跟控制器類名同名的xib,有,就會(huì)去加載
(3).判斷下有沒(méi)有跟控制器類名同名的xib,但是后綴不帶Controller的xib,如果有,就會(huì)去加載
(4).如果沒(méi)有任何xib描述控制器的view,就不會(huì)加載xib仇参。會(huì)創(chuàng)建一個(gè)顏色為clearColor的view。
2. 控制器View的生命周期
控制器View的生命周期方法
loadView: 加載view
viewDidLoad: view加載完畢
viewWillAppear: 控制器的view將要顯示
viewWillLayoutSubviews: 控制器的view將要布局子控件
viewDidLayoutSubviews: 控制器的view布局子控件完成
viewDidAppear: 控制器的view完全顯示
viewWillDisappear: 控制器的view即將消失的時(shí)候
viewDidDisappear: 控制器的view完全消失的時(shí)候
view生命周期方法調(diào)用順序
viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisappear -> viewDidDisappear
3. 控制器View的延遲加載
控制器的view是延遲加載的:創(chuàng)建控制器并不一定會(huì)創(chuàng)建控制器的view婆殿,等用到時(shí)再加載
下面我們通過(guò)一個(gè)小的程序來(lái)驗(yàn)證一下
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 創(chuàng)建控制器,并一定會(huì)創(chuàng)建控制器的view
ViewController *vc = [[ViewController alloc] init];
vc.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}```
ViewController.m
import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
// 自定義控制器的view
- (void)loadView
{
NSLog(@"%s",func);
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
view.backgroundColor = [UIColor greenColor];
self.view = view;
}
// 控制器的view加載完成的時(shí)候調(diào)用 - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor blueColor];
NSLog(@"%s",func);
}```
此時(shí)打印我們發(fā)現(xiàn)控制器的view顏色是紅色的诈乒,這是因?yàn)関iew的get方法底層中實(shí)現(xiàn)了loadView 和 viewDidLoad方法,loadView中將view設(shè)置為綠色婆芦,viewDidLoad方法中又將view設(shè)置成藍(lán)色怕磨,但是最后被vc.view.backgroundColor = [UIColor redColor];
設(shè)置為紅色喂饥。
?本文借鑒了很多前輩的文章,如果有不對(duì)的地方請(qǐng)指正肠鲫,歡迎大家一起交流學(xué)習(xí) xx_cc 员帮。