服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - 详解iOS App开发中UIViewController的loadView方法使用

详解iOS App开发中UIViewController的loadView方法使用

2021-01-10 14:52ForeverYoung21 IOS

这篇文章主要介绍了详解iOS App开发中UIViewController的loadView方法使用,讲解了访问view属性时loadView方法的调用及使用loadView时的一些注意点,需要的朋友可以参考下

当你访问一个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中多个网络请求的同步问题总结

    详解iOS中多个网络请求的同步问题总结

    这篇文章主要介绍了详解iOS中多个网络请求的同步问题总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    liang199111302021-03-15
  • IOSiOS开发之视图切换

    iOS开发之视图切换

    在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单。在iOS开发中常用的视图切换有三种,今天我们将...

    执着丶执念5272021-01-16
  • IOSiOS自定义UICollectionViewFlowLayout实现图片浏览效果

    iOS自定义UICollectionViewFlowLayout实现图片浏览效果

    这篇文章主要介绍了iOS自定义UICollectionViewFlowLayout实现图片浏览效果的相关资料,需要的朋友可以参考下...

    jiangamh8882021-01-11
  • IOSiOS中UILabel实现长按复制功能实例代码

    iOS中UILabel实现长按复制功能实例代码

    在iOS开发过程中,有时候会用到UILabel展示的内容,那么就设计到点击UILabel复制它上面展示的内容的功能,也就是Label长按复制功能,下面这篇文章主要给大...

    devilx12792021-04-02
  • IOSiOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)

    iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和

    这篇文章主要介绍了iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)的相关资料,需要的朋友可以参考下...

    CodingFire13652021-02-26
  • IOSiOS中MD5加密算法的介绍和使用

    iOS中MD5加密算法的介绍和使用

    MD5加密是最常用的加密方法之一,是从一段字符串中通过相应特征生成一段32位的数字字母混合码。对输入信息生成唯一的128位散列值(32个字符)。这篇文...

    LYSNote5432021-02-04
  • IOSiOS实现控制屏幕常亮不变暗的方法示例

    iOS实现控制屏幕常亮不变暗的方法示例

    最近在工作中遇到了要将iOS屏幕保持常亮的需求,所以下面这篇文章主要给大家介绍了关于利用iOS如何实现控制屏幕常亮不变暗的方法,文中给出了详细的...

    随风13332021-04-02
  • IOSiOS开发技巧之状态栏字体颜色的设置方法

    iOS开发技巧之状态栏字体颜色的设置方法

    有时候我们需要根据不同的背景修改状态栏字体的颜色,下面这篇文章主要给大家介绍了关于iOS开发技巧之状态栏字体颜色的设置方法,文中通过示例代码...

    梦想家-mxj8922021-05-10