ios-提升之【5】-viewController的loadView以及view的属性
2016-02-26 22:54
633 查看
原文:http://www.jianshu.com/p/8b1a5589a8c4
控制器有一个
首先要明白这个
一个控制器成为window的根控制器的时候,当这个界面即将显示,控制器的view会被加到window中用来显示界面。正常情况下控制器自带的view是
如果你在设置window的根控制器前创建一个Button直接加到window上,此时button出现在window上,但是在控制器的view的下面。此时点击按钮会发现按钮并不会响应点击。
这是因为控制器的view拦截了点击事件,这说明它并非真的
所以可以说控制器的
另外
前面说过,
当
当再次访问
之前的文章提到过,在给window设置完根控制器,根控制器的view并不是马上就被加到window上,也就是说此时view还未创建。在
现在我们知道view是懒加载的,所以如果在
现在我们知道控制器的
此时我们就改变了控制器原本自动创建的view,现在使用
控制器有一个
view属性,我们经常在控制器中通过
self.view来访问。这个view是一个很有意思的东西。
首先要明白这个
view到底是什么东西。
一个控制器成为window的根控制器的时候,当这个界面即将显示,控制器的view会被加到window中用来显示界面。正常情况下控制器自带的view是
"无色透明"的。
如果你在设置window的根控制器前创建一个Button直接加到window上,此时button出现在window上,但是在控制器的view的下面。此时点击按钮会发现按钮并不会响应点击。
这是因为控制器的view拦截了点击事件,这说明它并非真的
完全透明(因为如果完全透明,那么不会拦截点击事件,可以设置
viewController.view.alpha = 0来验证,此时按钮就可以响应点击)。事实上view是一个
backgroundColor为
clearColor的视图,
clearColor是
几乎透明的颜色但是并非
完全透明,也就是说当有类似点击事件发生的时候,
clearColor背景的view会拦截点击事件,因为它并非
完全透明。
所以可以说控制器的
view是一个
看不见摸得着的东西...
另外
view是
懒加载的,也就是说,只有真正使用到控制器的
view的时候它才会被创建出来。它就是在控制器的
-loadView方法中创建出来的。
- (void)loadView { // 类似这种实现 // 可能还会进行更多的操作,比如判断是否有指定storyboard,如果是就会加载storyboard中控制器的view等操作 UIView *view = [[UIView alloc] init]; view.backgroundColor = [UIColor clearColor]; // ... _view = view; }
前面说过,
view是
懒加载的,所以当使用
self.view的时候:
- (UIView *)view { // 类似这种实现 if (_view == nil) { [self loadView]; [self viewDidLoad]; } return _view; }
当
_view为nil的时候会调用
loadView方法方法,此时系统默认会创建一个UIView对象并将其赋值给
_view,此时
_view有了值,接着调用
viewDidLoad方法。
当再次访问
self.view的时候,因为
_view已经有值,所以会直接返回
_view。这也是为什么
loadView以及
viewDidLoad方法只会执行一次。
之前的文章提到过,在给window设置完根控制器,根控制器的view并不是马上就被加到window上,也就是说此时view还未创建。在
[self.window makeKeyAndVisible]之后界面即将显示的时候,这时候需要用到view,此时就会调用view的getter方法,接着执行
loadView,在接着执行
viewDidLoad等一系列方法。
现在我们知道view是懒加载的,所以如果在
[self.window makeKeyAndVisible]之前就用到控制器的view,那么它就会"提前”创建。
NSLog(@"%@", viewController.view); // 此时用到view,就会创建view
现在我们知道控制器的
view是通过
loadView方法创建的了,所以我们可以覆写这个方法来达到改变控制器的自带
view的目的:
- (void)loadView { JYView *view = [[JYView alloc] initWithFrame:[UIScreen mainScreen].bounds]; view.background = [UIColor blueColor]; _view = view; }
此时我们就改变了控制器原本自动创建的view,现在使用
self.view则得到的是
JYView的对象。
相关文章推荐
- 基于CocoaPods的iOS项目模块化实践
- ios-基础之【1】-类定义
- ios 在已有项目添加CoreData
- iOS 设计模式 - 观察者模式
- iOS 设计模式 - 组合模式
- iOS 设计模式 - 生成器模式
- 使用IOS7原生API进行二维码条形码的扫描
- RTMP协议实现IOS播放HEAAC思路
- iOS文件解析之XML解析
- IOS 文件夹创建,文件读写删除
- ios 相册获取图片模糊解决办法
- ios 通知和代理的区别
- iOS开发系列--数据存取
- iOS开发系列--地图与定位
- iOS开发系列--通知与消息机制
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
- iOS开发系列--视图切换
- iOS开发系列--无限循环的图片浏览器
- iOS开发系列--并行开发其实很容易
- Ios越狱心得