iOS - Interface Builder Outlets Not Initialized

3

我在Interface Builder中创建了一个带有标签和文本框的视图,并将其作为IBOutlets进行了定义。当我从Storyboard中定义的另一个视图跳转到该视图时,我可以完美地查看此屏幕。 然而,我还有另一个XIB文件和相关的UIViewController,我想从这个视图中访问它。因为我的XIB不在Storyboard中,所以无法使用segue跳转。相反,我必须以编程方式执行转换。

    PlantDetailViewController *plantDetailVC = [[PlantDetailViewController alloc] init];
    [self.currentNavigationController pushViewController:plantDetailVC animated:YES];

当执行此代码时,它会转换到视图,但视图是空白的。我已经对代码进行了调试并进入了viewDidLoad和viewWillAppear,但我的所有IBOutlets都是NIL...因此屏幕上什么也没有显示!
有人能告诉我为什么它们可能是NIL以及我如何初始化它们吗?
谢谢
布莱恩
2个回答

2
看起来你说你在storyboard中设置了PlantDetailViewController,并创建了一些在storyboard之外的OtherViewController。现在你想让OtherViewController实例化在storyboard中设置的PlantDetailViewController。
假设你的storyboard名为MainStoryboard.storyboard。
首先,你需要在Attributes Inspector下的View Controller部分中设置PlantDetailViewController的标识符。假设你将其设置为PlantDetail。
然后,在OtherViewController中,这应该可以工作:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
PlantDetailViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"PlantDetail"];
[self.currentNavigationController pushViewController:vc animated:YES];

0

-init 不会为您加载nib文件,如果您想要加载一个nib,请使用-initWithNibName:bundle:

如果您使用nib命名约定,您可以传递nil来加载与您的类名称和默认包匹配的nib,例如[[PlantDetailViewController alloc] initWithNibName:nil bundle:nil],有关详细信息,请参阅-nibName文档。


谢谢你的回复,Jonah。然而,我没有要加载的视图的 NIB 文件。该视图在 Storyboard 中定义,据我所知,Storyboard 中没有 NIB 文件。如果我错了,请纠正我。 - Brian Boyle
2
调用 UIViewControllerinit 方法等同于调用 initWithNibName:nil bundle:nil。如果有一个与视图控制器类名相同的 nib 文件(或者去掉末尾的单词 Controller 后相同的文件名),则视图控制器将在 loadView 中加载该 nib。 - rob mayoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接