小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
通过问题看本质!!!
日常开发过程中,我们很少会用到loadView方法,所以loadView方法经常会被忽略,以致于大家对它都没什么映象,其实loadView方法也是UIViewController的生命周期方法。
loadView方法什么时候会被调用呢?
每次UIViewController的view被访问 && view为nil
的时候,就会调用loadView方法,而且它是在viewDidLoad方法之前呢。
loadView方法有什么作用呢?
loadView方法主要是负责创建UIViewController的view。
loadView方法默认实现是什么?
既然可以不显示调用,那肯定会有默认实现。
1、先判断UIViewController是否从StoryBoard中加载的,如果是从StoryBoard加载的UIViewController。那么它就会从StoryBoard当中加载的UIViewController的view,把它设置当前UIViewController的view。
2、再判断UIViewController是否通过加载xib文件来创建UIViewController的view。
1)如果初始化方法指定的UIViewController的xib文件名,就会根据xib来创建UIViewController的view
CLTViewController *viewController = [[CLTViewController alloc] initWithNibName:@"CLTViewController" bundle:nil];
2)如果初始化方法没有指定的UIViewController的xib文件名,就会加载跟UIViewController相同名称的xib文件
//加载CLTViewController.xib
CLTViewController *viewController = [[CLTViewController alloc] init];
3)如果没有关联的xib文件,就会创建一个空白的UIView,赋值给UIViewController的view属性。
//伪代码
self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
loadView方法怎么用?
从loadView方法的默认实现可以得知,UIViewController的view可以通过StoryBoard/xib文件来创建,没有xib关联文件就会创建一个空白的view,有时候我们想通过代码来创建UIView,就可以重写loadView方法。
我们既然想创建一个自定义view,就没必要调用[super loadView]
(它默认会创建一个空白的UIView)。这样做可以节省不必要的开销。正确的做法应该是这样:
- (void)loadView {
//创建自己想要的view
self.view = [[CLTMainView alloc] initWithFrame:[UIScreen mainScreen].bounds];
}