Files
knowledge-kit/Chapter1 - iOS/1.3.md
2020-02-25 17:46:51 +08:00

100 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# loadView
1. 作用加载控制器的view
2. 何时调用当控制器的view第一次使用的时候就会调用
3. 使用场景只要想自定义控制器的view就调用此方法
访问控制器的View就相当于调用控制器中的view get方法
```
-(UIView *)view{
if(_view == nil){
[self loadView];
[self viewDidload];
}
return _view;
}
```
# 控制器加载view的流程
![控制器加载view的流程](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2287777-b6128646373dfffb.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方法存在则直接返回所以界面先是绿色再是棕色最后是红色
#### 来一个官方解释
![Apple 文档](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/2287777-8ff7c3b976ffb29a.png)