控制器加载的玄机

loadView

  1. 作用:加载控制器的view

  2. 何时调用:当控制器的view第一次使用的时候就会调用

  3. 使用场景:只要想自定义控制器的view就调用此方法

访问控制器的View就相当于调用控制器中的view get方法


-(UIView *)view{
    if(_view == nil){
        [self loadView];
        [self viewDidload];
        
    }
    return _view;
}

控制器加载view的流程

2017-7-16-01.png

  • 控制器的init方法底层会调用initWithNibName方法

MyViewController *vc = [[MyViewController alloc] init];

注意点:

  • 系统做判断的前提提条件:没有指定nibName;没有自定义loadView方法;控制器以...Controller命名

  • 判断原则:

  • 1、判断下有没有指定nibName,如果指定了就去加载nib

  • 2、判断有没有跟控制器同名的xib,但是xib的名称不带Controller的xib,如果有就去加载

  • 3、如果第二步没有指定,就判断有没有跟控制器类名同名的xib,如果有就去加载

  • 4、如果没有任何xib描述控制器的view,就不加载xib

MyViewController加载view的处理

  • 判断有没有指定xibName,如果有就去加载指定的xib

  • 判断有没有跟控制器类名同名的xib,但是名字不带controller

  • 判断有没有跟控制器类名同名的xib,有就去加载

  • 直接创建一个空的xib

例子

//在Appdelegate中
ViewController *vc = [[ViewController alloc] init];
vc.view.backgroundColkor = [UIColor redColor];
self.window.rootViewController = vc;
[pself.window makeKeyAndVisable];

//ViewController
-(UIView *)view{
    if(!_view){
        [self loadView];
        [self viewDidLoad];
    }
}

-(void)loadView{
    UIView*view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    view.backgroundColor = [UIColor greenColor];    self.view = view;

}

-(void)viewDidload{
    [super viewDidload];
    self.view.backgroundColor = [UIColor brownColor];
    
}

请问此时界面颜色是什么?

可能很多人会回到绿色。其实答案是 红色

why?在AppDelegate中vc.view.backgroundColor就是调用vc的view的getter方法,在getter方法内部判断_view是否存在,不存在则新建一个UIView,新建view是通过[self loadView]方法创建,创建成功直接调用viewdidload方法;存在则直接返回,所以界面先是绿色,再是棕色最后是红色

来一个官方解释

官方解释

转载于:https://www.cnblogs.com/hcxl/p/8280928.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值