loadView内部实现逻辑
1 loadView方法作用
创建控制器的view
第一次使用控制器View的时候调用,在控制器View的get方法中调用(使用的是懒加载)
当外界第一个使用当前控制器的View时,会调用当前一个方法loadView,创建控制器的View, 控制器的View是懒加载的,什么时候使用,什么时候才去创建,如果已经创建,就不会再创建了。
默认控制器View背景颜色是[UIColor clearColor]
2 loadView内部实现
首先会判断当前控制器是否从StoryBoard中加载,如果是,直接加载,如果不是,再判断有没有Xib来描述控制器的View,如果有,从Xib中加载,如果没有,loadView会直接通过[[UIView alloc] init]
来创建。

注意:一但重写了loadView,就代表控制器的View有自己来创建,重写
[super loadView]
也不行.
3 loadView和viewDidLoad关联
viewDidLoad方法系统是在控制器view加载完毕后运行一次,那他们是否有这一定的关联呢?
先来看下一个简单的demo:

在UIApplicationDelegate
加载完毕的代理方法中,用代码创建根控制器,并设置控制器view背景色为红色:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
FLTestViewCtr *testVc = [[FLTestViewCtr alloc] init];
// 设置控制器view背景颜色为红色
testVc.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = testVc;
[self.window makeKeyAndVisible];
return YES;
}
在FLTestViewCtr
中重写loadView
,自己来创建控制器view,并在viewDidLoad
方法中设置控制器view的背景颜色为黄色:
- (void)loadView {
UIView *view = [[UIView alloc] init];
view.backgroundColor = [UIColor blueColor];
self.view = view;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor];
// Do any additional setup after loading the view from its nib.
}
运行demo,显示出来的控制器会是什么颜色呢?
答案是红色,不是黄色,更不会是蓝色!
首先demo中第一次调用控制器的view是在应用加载完毕的回调方法中:
// 设置控制器view背景颜色为红色
testVc.view.backgroundColor = [UIColor redColor];
这里第一次使用控制器view开始是没值的,会先调用loadview
方法去创建控制区view,但是它是怎么和loadview
方法关联的呢?
答案是控制器view的get方法(view创建也是用的懒加载),在view的get方法中调用了loadview
,调用完loadview
方法后,会接着调用viewDidLoad
方法,然后getView
方法才会返回本次懒加载生成的控制器view,所以你在loadView
和viewDidLoad
方法中设置view颜色,并不是最后的颜色!
用伪代码描述如下:
//作用:创建控制器的View.
//什么时候调用,第一个使用控制器View时调用. 在控制器View的get方法调用 get方法是懒加载的
- (UIView *)view {
if (_view == nil) {
[self loadView];
[self viewDidLoad];
}
return _view;
}