ViewController 加载 View 的方式有:
-
创建 ViewController 的同时加载 View,它可通过加载关联 VC 的 xib,或纯代码创建实现。其调用方法有:
init
此方法可以是加载关联了 VC 的 xib方式,也可以是纯代码创建方式,其在UIViewController的执行顺序是:
initWithNibName:bundle:
init
loadView
viewDidLoad
initWithNibName:bundle:
此方法仅是加载关联了 VC 的 xib可以使用,它不会立即加载 View,所以使用时对 View 的额外操作应该在viewDidLoad
中进行。其在UIViewController的加载的顺序是:
initWithNibName:bundle:
loadView
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 的加载的顺序是:
init
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 的加载的顺序是:
-
initWithCoder:
-
awakeFromNib:
需要注意的是:在UIViewController的
viewDidLoad
中,一个使用此方法创建的 subView,设置frame,并添加到VC的视图时,若VC也是用xib创建并加载,此时VC视图在viewDidLoad
中大小是xib中显示的大小,但在viewWillAppear:
中显示的是另一个大小(除非当前手机屏幕大小刚好等于 xib 的视图的大小),这种情况下在界面上实际显示的效果会出错。解决此问题的办法是vc.view.autoresizesSubviews = NO
-
initWithCoder:
此方法是通过 unarchiver 获取 xib 中的所有对象。 -
awakeFromNib:
此方法是在 unarchiver 成功后,开始加载View,此方法可对一些控件进行额外的配置。