iOS中ViewController加载View的几种方式

ViewController 加载 View 的方式有:

  • 创建 ViewController 的同时加载 View,此种方式可分别通过加载关联1了 VC 的 xib,或纯代码创建实现。相关的调用方法有:

    • init
      加载关联了 VC 的 xib,或者纯代码创建皆可。此方法在UIViewController的加载的顺序是:

      1. initWithNibName:bundle:
      2. init
      3. loadView
      4. viewDidLoad
    • initWithNibName:bundle:
      加载关联了 VC 的 xib。此方法不会立即加载 View,所以使用时对 View 的额外操作应该在 viewDidLoad 中进行。此方法在UIViewController的加载的顺序是:

      1. initWithNibName:bundle:
      2. loadView
      3. viewDidLoad
    • loadView
      该方法是加载 View 时默认实现的,不允许直接调用,子类可重写。实现过程是:在Bundle里搜索与被创建的ViewController相同类名的xib文件,搜索到了就加载此xib(xib必须与被创建的ViewController关联),没有搜索到就创建一个“plain view”作为 ViewController’s view。

      注意:如果子类重写该方法,则不会自动去搜索并加载xib。所以如果使用init 方法创建VC,并加载关联了该 VC 的 xib 时,子类不要重写,否则此xib将不会被加载,视图漆黑。

  • 直接创建加载 View。此种方式可分别通过加载 xib(可不关联VC),或纯代码创建实现。相关的调用方法有:

    • init
      此方法在 UIView 的加载的顺序是:

      1. init
      2. initWithFrame:
    • initWithFrame:
      此方法在 UIView 的加载时只实现本身。

    • loadNibNamed:owner:options:
      加载 xib,默认xib的 File’s owner是NSObject,返回的是一个数组。
      若 xib 中 File’s owner 关联了其它类,则参数owner应该是该类实例对象;反之,则任何一个NSObject类或其子类的实例对象皆可。
      若 xib 中 View 不关联其它类,则仅仅只是获取加载View,不会触发UIView的方法;若关联了非UIView的类,不会触发UIView的方法,同时会显示台打印提示”Unknown class xxx in Interface Builder file.”;若关联了UIView或其子类,此方法在 UIView 的加载的顺序是:

      1. initWithCoder:
      2. awakeFromNib:

      需要注意的是:在UIViewController的 viewDidLoad 中,一个使用此方法创建的 subView,设置frame,并添加到VC的视图时,若VC也是用xib创建并加载,此时VC视图在 viewDidLoad 中大小是xib中显示的大小,但在 viewWillAppear: 中显示的是另一个大小(除非当前手机屏幕大小刚好等于 xib 的视图的大小),这种情况下在界面上实际显示的效果会出错。解决此问题的办法是 vc.view.autoresizesSubviews = NO

    • initWithCoder:
      此方法是通过 unarchiver 获取 xib 中的所有对象。

    • awakeFromNib:
      此方法是在 unarchiver 成功后,开始加载View,此方法可对一些控件进行额外的配置。


  1. xib关联ViewController的流程:在xib文件中,点击 File’s owner,在 Xcode 右侧检查器中“show the identity inspector”下选择“class”,写上要关联的ViewController类名,最后右击 File’s owner,拉线和 View 关联即可。

没有更多推荐了,返回首页