一个关于loadView的问题,由于平时开发中对这块没注意,现在来分析分析loadView
- 调用时机:访问controller的view时,如果view是nil或者说view还没有加载,loadView方法就会被调用。
默认的loadView做的事情:
- 如果再初始化controller的时候指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件
FirstViewController *controller =
[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
- 如果在创建的时没有显式的传递xib文件名,就会加载跟controller同名的xib文件
注:在iOS8中,必须显式的指定xib文件名,不然创建不成功
FirstViewController *controller = [[FirstViewController alloc] init];
- 如果没有找到相关联的xib文件,就会创建一个空白的UIView。
如果重写了loadView方法,并没有给view赋值,下面的例子中viewDidLoad用到self.view
时,发现self.view没有值,就会调用loadView,还是没有值,就会继续调用,会死循环调用viewLoad,一直到程序crash。
- (void)loadView {
NSLog(@"loadview ----ffff");
}
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor grayColor];
}
还有一种导致死循环的情况,在loadView中调用self.view,但是此时self.view没有值,就会自己调用自己死循环。
- (void)loadView {
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view.backgroundColor = [UIColor blueColor];
self.view = view;
}
正确使用姿势
如果我们想重写controller的view,就需要重写loadView,在里面对view进行赋值,此时不要写[super loadView]
,因为它会做上面说的那默认的三步。正确的写法:在loadView中使用view时,确保self.view已经有值。
- (void)loadView {
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.view = view;
self.view.backgroundColor = [UIColor blueColor];
}