【问题标题】:Nil while unwrapping an Optional IBOutlet valueNil 同时展开可选的 IBOutlet 值
【发布时间】: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() } }等...

标签: ios objective-c swift uitableview iboutlet


【解决方案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
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多