控制器載入的玄機

杭城小劉發表於2019-01-22

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方法;存在則直接返回,所以介面先是綠色,再是棕色最後是紅色

來一個官方解釋

官方解釋

相關文章