@IBInspectable 致命错误:解包可选值时意外发现 nil

Ala*_*ani 2 swift ibinspectable xcode8

我遇到了致命错误:在运行我的应用程序时,在解开一个 Optional 值时意外发现 nil 它因以下代码而挂起 这是调试显示的内容

Cra*_*itt 5

发生这种情况是因为 Inspectable 正在触发hasBottomLine要设置的didSet属性,因此在加载主视图之前要调用属性观察器。

我猜你lineHeightConstraint可能被定义为一个隐式解包的可选,比如:

@IBOutlet weak var lineHeightConstraint: NSLayoutConstraint!
Run Code Online (Sandbox Code Playgroud)

您必须在使用它之前解开可选项,例如:

lineHeightConstraint?.constant = hasBottomLine ? 3 : 0
Run Code Online (Sandbox Code Playgroud)

在加载视图后,您可能仍然需要设置此约束,因此您可能需要检查可选项是否包含 nil,如果是,请设置一个标志,然后在您的viewDidLoad方法中执行此行。(或者也许你可以在你的 viewDidLoad 中调用它)


更新的答案,额外的信息是此代码位于子类 UIView 而不是 UIViewController 中。

viewDidLoad您可以在 UIView 的layoutSubviews方法中执行此操作,而不是在您的方法中更新约束常量。例如:

override func layoutSubviews() {
    super.layoutSubviews()
    lineHeightConstraint?.constant = hasBottomLine ? 3 : 0
}
Run Code Online (Sandbox Code Playgroud)