重新激活 NSLayoutConstraint 在展开可选时发现 nil

Posted

技术标签:

【中文标题】重新激活 NSLayoutConstraint 在展开可选时发现 nil【英文标题】:Re-activating NSLayoutConstraint finds nil while unwrapping optional 【发布时间】:2016-05-23 11:02:01 【问题描述】:

我想以编程方式设置我的UITextView 的高度以相应地适应内容。我已将UITextView 的默认高度设置为遵循我设置的布局约束,但希望在用户触摸按钮时更改它。

@IBOutlet weak var descriptionHeight: NSLayoutConstraint!

我尝试使用layoutIfNeeded(),但它不会改变我的文本视图的大小(因为大小由布局约束保持)。

我尝试像这样暂时禁用约束:

print("before: \(descriptionTextView.frame)")
descriptionHeight.active = false
            
descriptionTextView.layoutIfNeeded()
print("after: \(descriptionTextView.frame)")

descriptionHeight.constant = descriptionTextView.frame.height         
descriptionHeight.active = true

但是在停用后访问插座时,会抛出异常:

致命错误:在展开可选值时意外发现 nil

似乎它正在正确计算尺寸:

之前:(8.0, 8.0, 398.0, 100.0)

之后:(8.0、8.0、398.0、954.666666666667)

为什么会这样? 有没有更好的方法来计算和设置我的UITextView 的正确大小?

【问题讨论】:

【参考方案1】:

制作插座strong:

@IBOutlet strong var descriptionHeight: NSLayoutConstraint!

编辑

似乎最新版本的 Xcode 将出口添加为:

@IBOutlet var descriptionHeight: NSLayoutConstraint!

正如@Dan 在 cmets 中提到的那样。

【讨论】:

strong 不起作用(可能在以前的 swift 版本中确实如此),而只是从声明中删除“弱”。

以上是关于重新激活 NSLayoutConstraint 在展开可选时发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

可以重新激活 NSLayoutConstraint 吗?

NSLayoutConstraint 激活/停用

激活/停用自动布局 NSLayoutConstraint

在 `cellForRowAt` 中激活 NSLayoutConstraint 直到滚动后才会呈现

如何激活以前停用的约束?

暂时移除 NSLayoutConstraint?