iOS 由使用xib创建UIViewController引出的l

2019-10-10  本文已影响0人  Gandalf_TheGray

最近在项目里遇到一个问题,加载一个带有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]就显得很多余了。

上一篇下一篇

猜你喜欢

热点阅读