UITableViewCell 中不遵守 NSLayoutConstraints

mag*_*oth 3 uitableview ios nslayoutconstraint swift prepareforreuse

我有一个UITableViewCellUILabelUIImageView。图像可以是可见的或隐藏的。

这是我的故事板: 故事板截图

的尾随部分有两个约束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
    }
}
Run Code Online (Sandbox Code Playgroud)

我有几个带有声音图标的单元格,很多没有。这是特定单元格首次出现时的样子:

良好的行为

当它第二次回到屏幕上时的样子:

不良行为

我确实理解问题来自正在重用的单元格。但我不明白如何防止这种行为。我试图做:

override func prepareForReuse() {
    configSound(true)
}
Run Code Online (Sandbox Code Playgroud)

在重用单元格之前重新激活约束,但它不起作用。

And*_*tta 8

我认为问题在于您weak对约束使用了参考。在这种情况下,只要第一次isActive将其属性设置为false,就会删除约束。从那以后,它是nil并且不能被重新激活。

解决方案:通过删除weak关键字使用强引用。

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