在 table 单元重用 UIKit 时重置约束

Contraints reset on table cell reuse UIKit

我正在制作一个聊天应用程序并试图找出 table 单元格重用机制。根据 incoming/ougoing 消息,我无法左右对齐聊天气泡。我现在拥有的是:

class ConversationTableViewCell: UITableViewCell {
    @IBOutlet weak var messageTextLabel: UILabel?
    @IBOutlet weak var messageView: UIView?
    @IBOutlet weak var trailingPaddingConstraint: NSLayoutConstraint?
    @IBOutlet weak var leadingPaddingConstraint: NSLayoutConstraint?
    
    func configure(with data: ConversationViewController.ConversationDataModel.Message) {
        
        messageView?.layer.cornerRadius = 12
        messageTextLabel?.text = data.text
        
        switch data.messageType {
        case .incoming:
            trailingPaddingConstraint?.isActive = false
            leadingPaddingConstraint?.isActive = true
            messageView?.backgroundColor = UIColor(named: "IncomingMessage") ?? .gray
        case .outgoing:
            trailingPaddingConstraint?.isActive = true
            leadingPaddingConstraint?.isActive = false
            messageView?.backgroundColor = UIColor(named: "OutgoingMessage") ?? .green
        }
    }
}

如您所见,我正在根据消息类型启用或禁用所需的约束,但似乎这些约束(并且只有它们)在重复使用单元格时会重置,从而导致气泡与前导面对齐.我该怎么做才能成功更新约束而不是 运行 到这样的问题?

我发现将 .isActive 设置为 false 实际上会删除约束(将 属性 设置为 nil)。正如 this answer 中所述,我试图使约束 class 属性不是 weak 并且一切正常!

现在代码如下所示:

class ConversationTableViewCell: UITableViewCell {
    @IBOutlet weak var messageTextLabel: UILabel?
    @IBOutlet weak var messageView: UIView?
    @IBOutlet var trailingPaddingConstraint: NSLayoutConstraint? //not weak
    @IBOutlet var leadingPaddingConstraint: NSLayoutConstraint? //not weak
    
    func configure(with data: ConversationViewController.ConversationDataModel.Message) {
        messageView?.layer.cornerRadius = 12
        messageTextLabel?.text = data.text
        
        switch data.messageType {
        case .incoming:
            trailingPaddingConstraint?.isActive = false
            leadingPaddingConstraint?.isActive = true
            messageView?.backgroundColor = UIColor(named: "IncomingMessage") ?? .gray
        case .outgoing:
            trailingPaddingConstraint?.isActive = true
            leadingPaddingConstraint?.isActive = false
            messageView?.backgroundColor = UIColor(named: "OutgoingMessage") ?? .green
        }
    }
    
}