控制器加載的玄機

loadView

  1. 做用:加載控制器的viewcode

  2. 什麼時候調用:當控制器的view第一次使用的時候就會調用get

  3. 使用場景:只要想自定義控制器的view就調用此方法it

訪問控制器的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];im

注意點:命名

  • 系統作判斷的前提提條件:沒有指定nibName;沒有自定義loadView方法;控制器以...Controller命名img

  • 判斷原則:di

  • 一、判斷下有沒有指定nibName,若是指定了就去加載nibview

  • 二、判斷有沒有跟控制器同名的xib,可是xib的名稱不帶Controller的xib,若是有就去加載vi

  • 三、若是第二步沒有指定,就判斷有沒有跟控制器類名同名的xib,若是有就去加載

  • 四、若是沒有任何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方法;存在則直接返回,因此界面先是綠色,再是棕色最後是紅色

來一個官方解釋

官方解釋

相關文章
相關標籤/搜索