我打电话的时候:
self.viewController = [[DidItViewController alloc] initWithNibName:@"DidItViewController" bundle:nil];
然后我在调试器中执行此行后立即检查self.viewController.navController,我发现它是空的(0x0)。
在DidItViewController上我将navController定义为:
IBOutlet NavigationController *navController;
在我的nib文件中,我将NavigationController绑定到文件所有者(DidItViewController)上的这个navController属性。
为什么我的navController没有创建?有任何想法吗?我想我可能会错过关于initWithNibName工作方式的一些内容。
感谢。
答案 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()