2009-05-23 25 views
1

当我需要以编程方式加载一个观点我执行以下操作:谁应该在程序加载的视图上调用viewDidLoad?

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

这工作得很好,但我的控制器的viewDidLoad不会被调用。所以我采取了loadNibNamed调用后手动调用它,但它似乎不正确。我期待框架以我的名义调用viewDidLoad。这是正确的方式还是我错过了什么?

回答

3

您应该加载视图控制器与

MyController* myController = [[MyController alloc] initWithNibName:@"myNib" bundle:nil]; 

确保您MyController从UIViewController的延伸,View属性界面生成器设置正确。

1

视图被UIViewController懒惰地加载。如果您在代码中使用访问器myController.view,则应加载视图并调用viewDidLoad

+1

不,这似乎是这种情况无论是。加载的视图显示正常,但viewDidLoad永远不会被调用。我可以在从笔尖加载的“普通”控制器上的viewDidLoad中由[UIViewController的视图]称为调试器堆栈看到,但似乎并不适用于控制器的制成手'。 – 2009-05-24 05:53:48

0

我注意到了同样的事情。我认为ViewDidLoad必须由视图CONTROLLER调用。由于您的笔尖中没有视图控制器,因此您必须手动调用viewdidload。我需要做同样的事情

5

我是Stack Overflow的新手,但是我发现了这个问题,并且发现了一些其他方法来加载一个确保viewDidLoad方法自动调用的nib文件。是正确的,但它需要你去ViewController的代码之外来加载nib文件,这里我提供的这两个例子允许你将代码保存在ViewController的实现中,不一定是更好的方法,只是不同而已。以做这种方式,请让我知道你的想法

首先,initWithNibName内:包:你的UIViewController子类的方法,可以取代电话:
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 

的关键是了解什么是写在UIViewController.h文件中的函数定义$initWithNibName:bundle:上方的注释(在我的答案的底部包含,请参见斜体)。

使用这两种方法之一做这件事的好处是viewDidLoad在任何一种情况下都会被调用。

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

指定初始化。如果你的 子类UIViewController,你必须调用这个 方法的超级实现,即使你没有使用 NIB。 (为了方便,默认的 init方法将为您执行此操作,并且 为这两个方法 参数指定nil。)在指定的NIB时, 文件的所有者代理应该有 类设置为您的视图控制器 子类,它连接到主视图的视图出口 。如果 调用此方法的名称为nil ,那么此类的'-loadView 方法将尝试加载名称与您的视图 控制器类相同的NIB 。如果没有这样的NIB在 事实存在,那么您必须 电话-setView:前 - 视图是 调用,或重写-loadView方法以编程方式设置你的观点。 - (ID)initWithNibName:(的NSString *)nibNameOrNil束:(一个NSBundle *)nibBundleOrNil;

相关问题