详解iOS App开发中UIViewController的loadView方法使用
详解iOS App开发中UIViewController的loadView方法使用
发布时间:2016-12-28 来源:查字典编辑
摘要:当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loa...

当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法。这个方法就会加载或者创建一个view对象,赋值给view属性。

loadView默认做的事情是:如果此ViewController存在一个对应的nib文件,那么就加载这个nib。否则,就创建一个UIView对象。

如果你用Interface Builder来创建界面,那么不应该重载这个方法。

控制器的loadView方法以及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的对象。

loadView使用中的一些注意点

永远不要主动调用这个函数。view controller会在view的property被请求并且当前view值为nil时调用这个函数。如果你手动创建view,你应该重载这个函数。如果你用IB创建view并初始化view controller,那就意味着你使用initWithNibName:bundle:方法,这时,你不应该重载loadView函数。

这个方法的默认实现是这样:先寻找有关可用的nib文件的信息,根据这个信息来加载nib文件,如果没有有关nib文件的信息,默认实现会创建一个空白的UIView对象,然后让这个对象成为controller的主view。

所以,重载这个函数时,你也应该这么做。并把子类的view赋给view属性(property)(你create的view必须是唯一的实例,并且不被其他任何controller共享),而且你重载的这个函数不应该调用super。

如果你要进行进一步初始化你的views,你应该在viewDidLoad函数中去做。在iOS 3.0以及更高版本中,你应该重载viewDidUnload函数来释放任何对view的引用或者它里面的内容(子view等等)。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新IOS开发学习
热门IOS开发学习
编程开发子分类