-
loadView 是干嘛用得?
- 第一次使用控制器view的时候,会调用
loadView方法
。 -
loadView方法干什么用? 创建UIView得
,创建控制器内部的view.
- 第一次使用控制器view的时候,会调用
-
系统的loadView做了哪些操作
- 当前控制器是否从
StoryBaord 文件
当中加载。如果是:
self.view = stroyboard 当中控制器的view
- 是否从
xib 文件
来描述控制器的View。如果是:
self.view = xib指定的view
- 如果都不是,创建一个
新的UIView
self.view = [[UIView alloc]init]
- 当前控制器是否从
-
注意:
子类一旦重写了- loadView方法
,系统的- loadView 方法
就失效了。(就不会自动去创建UIView了)
重点: 即使在自定义- loadView方法
里面写[super loadView]
,也不会自动去创建UIView了。-- 只要重写了"loadView 方法", 就不会去指定"Xib 文件"/"StoryBaord 文件"里面的"UIView" -- 所以,下面代码显示的是"红色的UIView",即使是"Xib / StoryBoard文件"里面的"UIView是其他颜色"。 - (void)loadView{ UIView * huhVeiw = [[UIView alloc]init]; huhVeiw.backgroundColor = [UIColor redColor]; self.view = huhVeiw; } -- 即使是"[super loadView]"也不会去指定/创建"UIView"。
-
控制器的View的get方法,做了什么事情?
- 控制器的View是懒加载方法(用到时加载,且只加载一次)
- 控制器的View,内部调用了
-loadView 方法
来创建控制的 UIView
- 模拟控制器View的懒加载
-(UIView *)view{ if (_view == nil) { [self loadView]; -- 控制器加载完成时,会调用"viewDidLoad方法" [self viewDidLoad]; } return _view; }
-
什么时候使用控制器的view ?
也就说,什么时候调用- loadView 方法
?-
makeKeyAndVisible 方法
包含了,把控制的view,添加到窗口的操作。 - 获取控制器的view的时候,调用了
- getView方法
。
rootViewController.view
-
- 其他概念:
- 每个控制器都有个UIView。
- 系统的UIView,默认是没有值得.
- 注意一个死循环,在
loadView 方法
里面调用self.view
下面代码, 不会死循环- "self.view" - 调用"getView方法" - "getView方法" - 内部会调用"loadView 方法" - "loadView 方法" - 如果里面有"self.view",那么就变成了"死循环了" - (void)loadView{ NSLog(@"%@",self.view); } -- 此代码也会 "死循环"。 - (void)loadView{ UIView * huhVeiw = [[UIView alloc]initWithFrame:self.view.frame]; }
-- self.view = huhVeiw; 调用的是"setView 方法" (不是"getView 方法") -- NSLog(@"%@",self.view); 调用的是"getView 方法",但是,此时的view,已经有值了。 所以,在"getView 方法"里,不会再去调用"loadView 方法",也就不会"死循环"。 - (void)loadView{ UIView * huhVeiw = [[UIView alloc]init]; huhVeiw.backgroundColor = [UIColor redColor]; self.view = huhVeiw; NSLog(@"%@",self.view); }
-(UIView *)view{ if (_view == nil) { [self loadView]; } return _view; }
- 有趣的测试
测试二loginVC.view.backgroundColor = [UIColor greenColor]; - (void)loadView{ UIView * huhVeiw = [[UIView alloc]init]; huhVeiw.backgroundColor = [UIColor redColor]; self.view = huhVeiw; } -- 这时候,显示的是红色的view,还是绿色的view ? 答: 绿色的view! 因为在"loginVC.view"的时候就会去调用,"getView方法" --> "loadView方法"。 在"loadView方法"里,将view的颜色变为红色,接着返回到"loginVC.view.backgroundColor 方法" 把"红色的view",改为"绿色的view"。
- 在上面代码的基础上,在增加一个"viewDidLoad 方法", 问最后view的背景颜色是"红色, 绿色, 还是蓝色"? 答: 是绿色背景的View "loginVC.view"之后, view的颜色是"红色"。然后立马加载"viewDidLoad 方法", view的颜色是"蓝色"。 最后返回,执行"loginVC.view.backgroundColor 方法",view的背景色是"绿色" 。 - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor blueColor]; //蓝色 }
-(UIView *)view{ if (_view == nil) { [self loadView]; -- 控制器加载完成时,会调用"viewDidLoad方法" [self viewDidLoad]; } return _view; }