说说loadView

一个关于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];
}

你可能感兴趣的:(说说loadView)