首页 > 解决方案 > 为什么 IBOutlet var 在模拟器上运行时具有价值,但在设备上运行时产生 nil?

问题描述

所以我有一个奇怪的情况。我有一个视图控制器,它的作用类似于标签栏控制器(但我自己制作了系统)。我们称它为“选项卡式视图控制器”。在其中,我实例化了 4 个其他视图控制器,每个控制器都有自己的 tableview。我采用这些视图控制器的根视图并将其作为子视图添加到我的选项卡式视图控制器上。当然,我还将 4 个视图控制器保存到选项卡式视图控制器中的视图控制器数组中。

在模拟器上运行时,所有这 4 个视图控制器都按预期工作。该表正确显示列表。底部标签栏可以很好地在视图控制器之间来回切换。一切看起来都很酷。

但是当我在我的设备上运行它时,每次我在任何子视图控制器上访问表视图插座时,我总是会遇到错误。“线程 1:致命错误:在展开可选值时意外发现 nil”。当我使用调试器检查值时,表视图出口为零。即使我对表格视图的引用是可选的,表格视图出口也从未改变过,始终为零。所以我得到了一个空屏幕而不是表格。但是底部标签栏仍然可以正常工作。

编辑:我还应该提到,当我调试视图层次结构时,我根本没有看到任何表视图的痕迹。感觉就像我只是在使用let vc = MyViewController.init(). 但如果模拟器也是如此,我可能可以进一步缩小问题范围。问题是,在模拟器中,它工作正常,子根视图正确填充了子视图。

于是我又做了一个实验。我在子视图控制器的表格视图顶部添加了一个简单的方形 UIView,带有红色背景。在模拟器中,红色方形视图正确显示在表格视图的中间和顶部。在设备上,也没有任何红色方块视图的痕迹,也没有任何表格视图的痕迹。

这是我用来实例化视图控制器的代码:

let sb = UIStoryboard(name: "Main", bundle: nil);
let vc = sb.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController;

为什么会这样?如何解决这个问题?

标签: iosswift

解决方案


解决方案是创建新的故事板,创建新的视图控制器,将子视图从旧视图控制器复制并粘贴到新视图控制器。然后创建新类,将旧文件中的类内容复制并粘贴到新文件中。不要忘记链接所有的 IBOutlet。使用它,视图控制器可以正常工作。我怀疑这与我们多次遇到涉及故事板的 git 冲突有关。可能我们没有正确解决冲突,故事板的一些重要部分被删除了。大概。只是一个猜测。


推荐阅读