谁应该在以编程方式加载的视图上调用viewDidLoad?

Rem*_*anu 1 iphone cocoa-touch

当我需要以编程方式加载视图时,我执行以下操作:

MyController* myController = [[MyController alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"myNib" owner:myController options:nil];
// use my controller here, eg. push it in the nav controller
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我的控制器的viewDidLoad永远不会被调用.所以我在loadNibNamed调用之后尝试手动调用它,但它似乎不正确.我期待框架代表我调用viewDidLoad.这是正确的方式还是我错过了什么?

Jay*_*Gee 5

我是Stack Overflow的新手,但我发现了这个问题并发现了一些其他方法来加载一个nib文件,以确保自动调用viewDidLoad方法.Ed Marty的回答是正确的,但它要求你在ViewController的代码之外加载nib文件,我在这里提供的这两个例子允许你将代码保存在ViewController的实现中.不一定是更好的方式,只是不同.如果您知道这样做的任何缺点,请告诉我您的想法.

首先,在UIViewController子类的initWithNibName:bundle:方法内,您可以替换调用:
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

用这样的东西:
self = [super initWithNibName:@"NameOfAlternateNibFile" bundle:nibBundleOrNil];

或者,您可以通过以下方式完成看似完全相同的事情:

[[NSBundle mainBundle] loadNibNamed:@"NameOfAlternateNibFile" owner:self options:nil];
[self setView:self.view]; //this line ensures that the viewDidLoad method is called
Run Code Online (Sandbox Code Playgroud)

关键是要理解$initWithNibName:bundle:UIViewController.h文件中函数定义上面的注释中所写的内容(包含在我的答案底部,请参见斜体).

使用这些方法之一执行此操作的好处是在任一方案中都会调用viewDidLoad.

以下是UIViewController.h中列出的指令:

指定的初始化程序.如果您是UIViewController的子类,则必须调用此方法的超级实现,即使您没有使用NIB也是如此.(为方便起见,默认的init方法将为您执行此操作,并为这两个方法参数指定nil.)在指定的NIB中,File的Owner代理应将其类设置为视图控制器子类,并使用视图插座连接到主视图.如果使用nil nib名称调用此方法,则此类的-loadView方法将尝试加载名称与视图控制器类相同的NIB.如果没有这样的NIB实际上存在,那么您必须调用-setView: -视图之前 调用,或重写-loadView方法以编程方式设置你的观点. - (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil;