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()
我对@987654325@ 的实现如下:
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 值的主要内容,如果未能解决你的问题,请参考以下文章