展开可选 IBOutlet 值时为零
Nil while unwrapping an Optional IBOutlet value
我有 fatal error: unexpectedly found nil while unwrapping an Optional value
IBOutlet
。
在我的自定义视图中,我已将我的出口与 XIB
文件相关联。我已经仔细检查过这个。这是它的样子:
@IBOutlet weak var label: UILabel! {
didSet {
label.textColor = .redColor()
}
}
我对 layoutSubviews
的实现如下所示:
override func layoutSubviews() {
super.layoutSubviews()
label.preferredMaxLayoutWidth = label.frame.size.width
}
尽管 layoutSubviews
方法必须在 UI 元素初始化后调用,但我收到错误消息:
fatal error: unexpectedly found nil while unwrapping an Optional value
此错误由行触发:
label.preferredMaxLayoutWidth = label.frame.size.width
为什么会这样?如何解决?
尝试在 viewDidLayoutSubviews
而不是 layoutSubviews
中进行。 UI 元素应该在 viewDidLayoutSubviews
中准备就绪,但在 layoutSubviews
中不需要。
您可以通过使用 if let 语句安全地展开标签来防止崩溃的发生。
if let mylabel = label {
mylabel.preferredMaxLayoutWidth = mylabel.frame.size.width
}
你应该使用:
label?.preferredMaxLayoutWidth = label.frame.size.width
这之前在 layoutSubviews 的早期调用中无法设置出口,但在下一次调用中将会设置。使用可选链接可以避免显式可选解包。如果标签为零,则自动跳过分配。
我有 fatal error: unexpectedly found nil while unwrapping an Optional value
IBOutlet
。
在我的自定义视图中,我已将我的出口与 XIB
文件相关联。我已经仔细检查过这个。这是它的样子:
@IBOutlet weak var label: UILabel! {
didSet {
label.textColor = .redColor()
}
}
我对 layoutSubviews
的实现如下所示:
override func layoutSubviews() {
super.layoutSubviews()
label.preferredMaxLayoutWidth = label.frame.size.width
}
尽管 layoutSubviews
方法必须在 UI 元素初始化后调用,但我收到错误消息:
fatal error: unexpectedly found nil while unwrapping an Optional value
此错误由行触发:
label.preferredMaxLayoutWidth = label.frame.size.width
为什么会这样?如何解决?
尝试在 viewDidLayoutSubviews
而不是 layoutSubviews
中进行。 UI 元素应该在 viewDidLayoutSubviews
中准备就绪,但在 layoutSubviews
中不需要。
您可以通过使用 if let 语句安全地展开标签来防止崩溃的发生。
if let mylabel = label {
mylabel.preferredMaxLayoutWidth = mylabel.frame.size.width
}
你应该使用:
label?.preferredMaxLayoutWidth = label.frame.size.width
这之前在 layoutSubviews 的早期调用中无法设置出口,但在下一次调用中将会设置。使用可选链接可以避免显式可选解包。如果标签为零,则自动跳过分配。