说说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];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • /* UIViewController is a generic controller base class th...
    DanDanC阅读 5,855评论 0 2
  • UIViewController 的生命周期答:来源:http://www.cnblogs.com/dahe007...
    IreneWu阅读 3,805评论 1 2
  • 1.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作...
    曾令伟阅读 4,685评论 0 10
  • 一、深复制和浅复制的区别? 1、浅复制:只是复制了指向对象的指针,即两个指针指向同一块内存单元!而不复制指向对象的...
    iOS_Alex阅读 5,286评论 1 27
  • http://www.devstore.cn/essay/essayInfo/6525.html【原文地址】 序言...
    起名好难_fz阅读 3,856评论 1 1