【问题标题】:Contraints reset on table cell reuse UIKit重置表格单元重用 UIKit 的约束
【发布时间】:2021-03-03 10:57:06
【问题描述】:

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

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
        }
    }
}

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

【问题讨论】:

  • 您是否在返回单元格之前尝试调用layoutIfNeeded()
  • @πter 是的,我做到了。顺便说一句,我刚刚发现将 .isActive 设置为 false 会删除约束,这意味着leadingPaddingConstraint 和 trailingPaddingConstraint 在某些时候都为零
  • 哦,不知怎的,我错过了,你是完全正确的。所以我想从约束中删除 weak 会解决你的问题。

标签: swift uitableview uikit cell


【解决方案1】:

我发现将 .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
        }
    }
    
}

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多