【发布时间】:2019-05-10 18:08:43
【问题描述】:
我有一个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)
}
在重新使用单元格之前重新激活约束,但它不起作用。
【问题讨论】:
-
单元格是否从有图像变为没有图像(在渲染后),还是一旦单元格由表格设置,它们会保持这种状态直到整个表重新加载了吗?
-
@nard 他们不会即时更改。如果一个单元格有一张图片,它就会一直有,或者永远不会有。
-
然后只需创建两种类型的单元格,有图像和没有图像,并让数据源确定哪一个出列。当表格变大并且滚动速度很快时,在可重用单元格中有条件地实施约束可能会产生令人讨厌的结果 - 使单元格尽可能保持基本以优化表格性能。
-
问题是我简化了帖子的代码,但它做了更多的事情,我不喜欢代码重复,我不知道如何从具有
IBOutlet的类继承(或如果这是可能的)。
标签: ios swift uitableview nslayoutconstraint prepareforreuse