为什么IBOutlet变量在模拟器上运行时具有值,而在设备上运行时却产生nil?

时间:2018-10-25 03:41:22

标签: ios swift

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

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

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

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

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

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

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

为什么会这样?该如何解决?

1 个答案:

答案 0 :(得分:1)

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