【问题标题】:IBOutlet is nilIBOutlet 为零
【发布时间】:2017-06-08 07:10:48
【问题描述】:

我已经为一个视图创建了一个标准出口,它将根据上一个屏幕上选择的按钮保存不同的信息。

@IBOutlet weak var labelView: UIView!

它显示它在故事板视图和代码本身中都已连接,但是,每次我得到对 labelView 的任何引用时,例如:

if detail.description == "About"
{
   labelView.backgroundColor = UIColor.red
}

然后应用程序崩溃了:

fatal error: unexpectedly found nil while unwrapping an Optional value

我已经尝试了所有我能想到或在互联网上阅读的内容:

  • 删除并更换了连接

  • 像一篇建议的帖子一样删除了派生数据文件夹

  • 创建了对 self.view 的引用以强制其加载

  • 已将其移至viewDidAppear

  • 已将其移至viewWillAppear

  • 已将其移至 viewDidLoad(这是当前所在的位置
    叫)

在这一点上,我确信答案相当简单,我只是完全想念它。

【问题讨论】:

  • 您能否显示回溯,以便我们更好地了解正在发生的事情?到底是哪条线崩溃了?
  • 对不起,如果我问你一个简单的问题:你确定你在那一行有崩溃吗?有没有试过下断点,一步一步来看看是不是真的是崩溃线?
  • 您是否在某个时候从其父视图中删除视图?

标签: swift iboutlet xcode8.2


【解决方案1】:

要查看出口设置为零的位置,请尝试以下操作:

@IBOutlet weak var labelView: UIView? {
    didSet {
        print("labelView: \(labelView)")
    }
}

在加载视图时,您应该会看到它设置为初始值。如果它被设置为nil,则在print 上放置一个断点,您应该能够从回溯中看到它发生的位置。

【讨论】:

  • 添加它并检查回溯(再次)我终于发现了这个简单而愚蠢的错误。我正在修改以前的项目,并且错过了对在视图加载之前从 segue 引用视图的函数的调用,因此为零。我现在确实觉得很愚蠢。
【解决方案2】:

视图是惰性初始化的。如果您在视图生命周期before viewDidLoad() 调用受影响的代码行,请尝试提前访问view

if detail.description == "About" {
    _ = self.view
    labelView.backgroundColor = UIColor.red
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多