9

当我打电话时:

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

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

在 DidItViewController 上,我将 navController 定义为:

IBOutlet NavigationController *navController; 

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

为什么我的 navController 没有被创建?有任何想法吗?我想我可能遗漏了一些关于 initWithNibName 工作方式的东西。

谢谢。

4

4 回答 4

21

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

示例代码

在这种情况下,NIB 中的 File's Owner 是 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.

从参考文件中选择

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

于 2010-01-24T08:12:08.923 回答
8

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

于 2009-12-16T03:32:22.803 回答
2

使用该方法时可能不会调用 viewDidLoad 方法。

PhotoShow* obj = [[PhotoShow alloc] init];
[[NSBundle mainBundle] loadNibNamed:@"PhotoShow" owner:obj options:nil];
于 2013-06-04T03:00:12.487 回答
1

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

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

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

于 2009-12-16T08:20:38.967 回答