调用initWithNibName不会初始化nib中的项,它有0x0

时间:2009-12-16 03:28:13

标签: iphone uinavigationcontroller nib

我打电话的时候:

self.viewController = [[DidItViewController alloc] initWithNibName:@"DidItViewController" bundle:nil];

然后我在调试器中执行此行后立即检查self.viewController.navController,我发现它是空的(0x0)。

在DidItViewController上我将navController定义为:

IBOutlet NavigationController *navController; 

在我的nib文件中,我将NavigationController绑定到文件所有者(DidItViewController)上的这个navController属性。

为什么我的navController没有创建?有任何想法吗?我想我可能会错过关于initWithNibName工作方式的一些内容。

感谢。

4 个答案:

答案 0 :(得分:21)

或者您可以使用[NSBundle loadNibNamed:owner:options:]方法代替。此方法可确保连接所有插座连接。 ([UIViewController initWithNibName: bundle:]没有)

示例代码

在这种情况下,NIB中的文件所有者是PhotoShow类的外部实例。

// This works completely. All outlets works.
PhotoShow* obj = [[PhotoShow alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"PhotoShow" owner:obj options:nil];
// Outlets are always available at this moment.

// This works. but does not connects outlets correctly sometimes.
PhooShow* obj = [[PhotoShow alloc] initWithNibName:@"PhotoShow" bundle:[NSBundle mainBundle]];
// Outlets may not available at this moment.

从参考文件中选择

您可以使用此方法加载用户界面并使对象可用于您的代码。在加载过程中,此方法取消归档每个对象,初始化它,将其属性设置为其配置值并重新建立与其他对象的任何连接。 (要建立插座连接,此方法使用setValue:forKey:方法,这可能会导致插座中的对象自动保留。)有关nib加载过程的详细信息,请参阅“资源编程指南”。

答案 1 :(得分:8)

xib加载所有组件可能需要一些时间。 只有在viewDidLoad之后才能确定navController已初始化

答案 2 :(得分:2)

使用此方法时,可能无法调用viewDidLoad方法。

PhotoShow* obj = [[PhotoShow alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"PhotoShow" owner:obj options:nil];

答案 3 :(得分:1)

您不应该定义“navController”属性;所有UIViewControllers都已经自动定义了“navigationController”和“navigationItem”属性。这些将分别指向导航控制器和导航项,假设视图位于导航控制器堆栈上。

如前所述,在调用“viewDidLoad”函数之前,不能依赖“navigationController”属性。您应该覆盖“DidItViewController”中的“viewDidLoad”方法,以执行您想要对导航控制器执行的任何操作。

编辑:
见:UINavigationController* UIViewController::navigationController()
请参阅:UINavigationItem* UIViewController::navigationItem()