微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

表格单元格重用 UIKit 上的限制重置

如何解决表格单元格重用 UIKit 上的限制重置

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

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 中所述,我尝试使约束类属性不是 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
        }
    }
    
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。