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

dev*_*nkb 9 iphone uinavigationcontroller nib

我打电话的时候:

self.viewController = [[DidItViewController alloc] initWithNibName:@"DidItViewController" bundle:nil];
Run Code Online (Sandbox Code Playgroud)

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

在DidItViewController上,我将navController定义为:

IBOutlet NavigationController *navController; 
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Eon*_*nil 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.
Run Code Online (Sandbox Code Playgroud)

从参考文件中选择

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


enn*_*ler 8

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