iOS 由使用xib创建UIViewController引出的l
最近在项目里遇到一个问题,加载一个带有xib的ViewController的时候,用的[[XIBTestViewController alloc] init]方法,没有指定xib文件,原以为会崩溃或者加载不出来,结果正常加载,并且正常显示xib的内容。
原来用XIBTestViewController* xibVC=[[XIBTestViewController alloc] init];创建的时候,系统会调用loadVIew方法寻找和类同名的xib文件加载;这里要注意的是不能重写loadView方法,一旦重写,就无法自动匹配xib文件加载;
代码创建ViewController时候:
[[XIBTestViewController alloc] init]
相关方法的调用顺序是这样的:
1.- (id)init;
2.- (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil;
3.- (void)loadView;
4.- (void)viewDidLoad;
init方法每次也会调用一下initWithNibName
而loadView方法的作用就是为了创建UIViewController的view,创建过程是这样的:
1.如果在创建ViewController时候指定了xib文件,就加载xib文件来创建UIViewController的view;
2.如果创建ViewController时候没有指定xib文件,就查找和ViewController同名的xib文件来加载;
3.如果没指定也没找到相关联的xib文件,就创建一个空白view赋值给UIViewController的view;
这就是为什么创建UIViewController时候没有指定xib文件,也一样正常加载出来的原因。
而loadView方法应该什么时候调用?
- (void)loadView;// This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.
苹果官方意思就是当在没有用到xib加载方式且需要自定义自己的view时候可以在这个方法里创建赋值,不应该直接被调用,而是由系统调用;
错误用法:[self loadView],不能自己主动调用;
比如不想用系统给默认创建的给ViewController的那个view,那就重写loadView方法:
- (void)loadView{
self.view=[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
需要注意的是:重写loadView方法时候就不需要再调[super loadView]了,因为如果我们重写了loadView的方法,就代表着我们需要初始化的是自定义的view,而不再是系统默认的view,如果再调用[super loadView]就显得很多余了。