ios - NSLayoutConstraints 在 UITableViewCell 中不受尊重
问题描述
我有一个UITableViewCell
与一个UILabel
和一个UIImageView
。图像可以是可见的或隐藏的。
的尾部有两个约束UILabel
,一个 (a) 等于 8 与UIImageView
,另一个 (b) 大于或等于 8 与单元格的右边距。我保留第一个 (a) 的参考,如果有声音或没有声音,我会激活或停用约束。
这是我的代码:
class MyTableViewCell: UITableViewCell {
@IBOutlet weak var label: UILabel?
@IBOutlet weak var icon: UIImageView?
@IBOutlet weak var spaceBetweenIconAndLabelConstraint: NSLayoutConstraint?
override func awakeFromNib() {
super.awakeFromNib()
icon?.image = UIImage(named: "sound")
}
func config(with name: String, hasSound: Bool) {
label?.text = name
configSound(hasSound)
}
private func configSound(_ hasSound: Bool) {
icon?.isHidden = !hasSound
spaceBetweenIconAndLabelConstraint?.isActive = hasSound
}
}
我有几个带有可见声音图标的单元格,很多没有。以下是特定单元格首次出现时的样子:
当它再次出现在屏幕上时的样子:
我确实知道问题出在被重复使用的单元格上。但我不明白如何防止这种行为。我试着做:
override func prepareForReuse() {
configSound(true)
}
在重用单元格之前重新激活约束,但它不起作用。
解决方案
我认为问题在于您使用weak
参考作为约束的事实。在这种情况下,一旦第一次将其isActive
属性设置为,约束就会被删除。false
从那以后它是nil
并且不能被重新激活。
weak
解决方案:通过删除关键字来使用强引用。
@IBOutlet var spaceBetweenIconAndLabelConstraint: NSLayoutConstraint!
推荐阅读
- git - 是否可以从 master 创建的分支中获取更改作为本地更改返回到 master?
- pandas - pd.isnull().sum() 的 Vaex 命令是什么?
- javascript - 引导日期选择器始终在顶部打开
- c# - (反)序列化具有特定结构的潜在嵌套对象的 BSON 数据
- symfony - Symfony 功能测试:第二次调用 $client->request(),无缘无故地改变了测试结果
- vba - 根据将定义日期范围的 2 个输入框,将一个选项卡中的表中的所有数据复制到同一工作簿中的另一个选项卡中
- node.js - Firebase 函数 shuffle firestore 数组 onUpdate
- python - 子类 QLineEdit 并在下面添加标签
- reporting-services - 特别是在 SSRS tablix 中的非换行连字符
- javascript - 有没有办法检查安装在用户机器上的应用程序的版本?