iOS - Interface Builder Outlets 未初始化
Posted
技术标签:
【中文标题】iOS - Interface Builder Outlets 未初始化【英文标题】:iOS - Interface Builder Outlets Not Initialized 【发布时间】:2012-03-30 00:45:18 【问题描述】:我在 Interface Builder 中创建了一个视图,其中包含一些标签和文本作为 IBOutlets。当我从我在 Storyboard 中定义的另一个视图中转到它时,我可以完美地查看这个屏幕。 但是,我有另一个 XIB 和一个关联的 UIViewController,我想从中访问该视图。因为我的 XIB 不在情节提要中,所以我不能继续下去。相反,我必须以编程方式执行转换。
PlantDetailViewController *plantDetailVC = [[PlantDetailViewController alloc] init];
[self.currentNavigationController pushViewController:plantDetailVC animated:YES];
执行此代码时,它会转换到视图,但视图只是空白。我已经调试了代码,它进入了 viewDidLoad 和 viewWillAppear 但是我所有的 IBOutlets 都是 NIL ......所以它没有出现在屏幕上!
谁能告诉我为什么它们可能是 NIL 以及如何初始化它们?
谢谢
布赖恩
【问题讨论】:
【参考方案1】:听起来您是在说您在情节提要中设置了PlantDetailViewController
,并且在情节提要之外创建了一些OtherViewController
。现在您希望 OtherViewController
实例化在您的故事板中设置的 PlantDetailViewController
。
假设您的故事板名为MainStoryboard.storyboard
。
首先,您需要在情节提要中设置PlantDetailViewController
的标识符。您可以在视图控制器部分下的属性检查器中执行此操作。假设您将其设置为PlantDetail
。
然后,在 OtherViewController
中,这应该可以工作:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
PlantDetailViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"PlantDetail"];
[self.currentNavigationController pushViewController:vc animated:YES];
【讨论】:
【参考方案2】:-init
不会为您加载 nib 文件,如果您想加载 nib,请使用 -initWithNibName:bundle:
如果您使用 nib 命名约定,您可以传递 nil
来加载名称与您的类和默认包匹配的 nib,即 [[PlantDetailViewController alloc] initWithNibName:nil bundle:nil]
,有关详细信息,请参阅 -nibName
的文档。
【讨论】:
感谢乔纳的回复。但是,我没有用于要加载的视图的 NIB。该视图是在 Storyboard 中定义的,据我所知,Storyboard 中没有 NIB 文件。如果我错了,请纠正我。 调用UIViewController
的init
方法和调用initWithNibName:nil bundle:nil
是一样的。如果有一个 nib 与视图控制器的类同名(或名称相同但没有单词 Controller
结尾),则视图控制器将在 loadView
中加载该 nib。以上是关于iOS - Interface Builder Outlets 未初始化的主要内容,如果未能解决你的问题,请参考以下文章
在我看来,iOS 项目未显示从 Interface Builder 构建的 Interface 元素
iOS - Interface Builder Outlets 未初始化
iOS:在 Interface Builder 中使用动态 contentSize 创建 UIScrollView