ViewController 的出口视图首先是非零,然后从包加载时为零

Posted

技术标签:

【中文标题】ViewController 的出口视图首先是非零,然后从包加载时为零【英文标题】:ViewController's outlet view first non-nil, then nil when loading from bundle 【发布时间】:2014-05-28 16:55:22 【问题描述】:

我正在从带有initWithNibName:bundle: 的捆绑包中加载UIViewController。如果我在其viewDidLoad 中设置断点,我可以看到它的view 已设置。在 Interface Builder 中查看 About.xib 时,我也可以看到这一点。

但是,一旦第一次实际使用视图(根据我的应用程序逻辑调用[self.navigationController pushViewController:viewController animated:YES]),我会收到此错误:

* 由于未捕获的异常 'NSInternalInconsistencyException' 导致应用程序终止,原因:'-[UIViewController _loadViewFromNibNamed:bundle:] 加载了“关于”笔尖,但未设置视图出口。'

这也是触发viewDidLoad的调用。所以显然在通话过程中,view 首先是非零(应该是),后来显然又变成了零。

如果我在调用之前立即在调试器中键入po [viewController view],我会收到此错误(这可能只是相同症状的另一种表现形式):

错误:执行被中断,原因:内部ObjC异常 breakpoint(-3)..进程已经回到之前的状态 表达式求值。

如何加载和使用视图控制器以及现有的导航栏而不遇到这些错误?

更新如果我从我的故事板(不一定是我的主故事板)而不是从 XIB 文件加载视图控制器,问题显然会消失。

【问题讨论】:

【参考方案1】:

在 Xcode 中查看 xib 文件时,在身份检查器中,自定义子类是否设置为您查看控制器的类?如果你设置了,然后转到连接检查器,你会看到一个名为“view”的属性,只需将它拖到 Interface builder 中的视图中,它应该可以工作

【讨论】:

是的,这就是我所说的view 在界面生成器中查看视图控制器时也设置的意思。但问题仍然存在。【参考方案2】:

我的猜测是你覆盖了一些默认的 UIViewController 行为,要么将其 view 设置为 weak 属性,要么是一个奇怪的 loadView 方法,或者只是没有在你的覆盖方法之一中调用 super


另一个常见错误是调用不匹配的 super 方法(从 awakeFromNib 调用 super viewDidLoad 等),当您移动代码或尝试不同的事情后可能会发生这种情况。

【讨论】:

我过去也遇到过类似的问题,原因是没有打电话给[super loadView]

以上是关于ViewController 的出口视图首先是非零,然后从包加载时为零的主要内容,如果未能解决你的问题,请参考以下文章

在不同的视图控制器中更改另一个视图的出口

从 ViewController 到 UITableView 的 tableView 出口无效。插座无法连接到重复内容

无法制作标签的出口

如何在不同的视图控制器中创建插座?

从具有相同 ViewController 类的相同情节提要中调用第二个视图

无法将 OUTLET 从 Storyboard 导入到 ViewController