Nil 同时展开可选的 IBOutlet 值

Posted

技术标签:

【中文标题】Nil 同时展开可选的 IBOutlet 值【英文标题】:Nil while unwrapping an Optional IBOutlet value 【发布时间】:2016-11-03 08:56:57 【问题描述】:

我有一个fatal error: unexpectedly found nil while unwrapping an Optional value 用于IBOutlet

在我的自定义视图中,我已将我的插座与XIB 文件相关联。我已经仔细检查了这一点。看起来是这样的:

@IBOutlet weak var label: UILabel! 
    didSet 
        label.textColor = .redColor()
    

我对@9​​87654325@ 的实现如下:

override func layoutSubviews() 
    super.layoutSubviews()

    label.preferredMaxLayoutWidth = label.frame.size.width

尽管在 UI 元素初始化后必须调用 layoutSubviews 方法,但我得到一个错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

此错误由以下行触发:

label.preferredMaxLayoutWidth = label.frame.size.width

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

【问题讨论】:

可能故事板和您的文件之间的链接已损坏,尝试创建一个新链接(ctrl + 拖动)到您的 IBoutlet 我已经试过很多次了。链接正常。 你是如何创建视图控制器实例的? 这是一个视图,不是视图控制器 可能是@IBOutlet weak var label: UILabel? = nil didSet label?.textColor = .redColor() 等... 【参考方案1】:

尝试使用viewDidLayoutSubviews 而不是layoutSubviews。您的 UI 元素应该在 viewDidLayoutSubviews 中准备就绪,但在 layoutSubviews 中不是必需的。

【讨论】:

是的,但问题是,这是一个视图,而不是视图控制器 awakeFromNib() ? 这个方法不适合我。 请问为什么?但是,在 viewController 中,在您呈现 uiview 的内容中,在 viewDidLayoutSubviews 调用中设置标签 preferedwidth。 我正在实施 hack 以启用 ios 7 的动态表格视图单元格。我需要在布局更改后设置此属性。【参考方案2】:

你应该使用:

label?.preferredMaxLayoutWidth = label.frame.size.width

这之前在 layoutSubviews 的早期调用中尚未设置出口,但在下一次调用中将会设置。使用可选链接可以避免显式可选解包。如果 label 为 nil,则自动跳过分配。

【讨论】:

【参考方案3】:

您可以通过使用 if let 语句安全地展开标签来防止崩溃。

if let mylabel = label 
   mylabel.preferredMaxLayoutWidth = mylabel.frame.size.width

【讨论】:

是的,但对我来说很有趣,为什么标签还没有准备好?另外,preferredMaxLayoutWidth 将被设置的保证在哪里? 阅读:***.com/questions/7588066/…

以上是关于Nil 同时展开可选的 IBOutlet 值的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Swift 隐式展开可选的“nil”?

Nil 同时展开一个实际具有值的可选

Xcode 在非可选的字符串上返回 nil

发现可选值错误 nil swift 3

在 swift 4.0 中从 firebase 快照字典中获取值时打开一个可选的 nil

“致命错误:在展开可选值时意外发现 nil”,同时调用协议方法