在 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
}
}
}
我正在制作一个聊天应用程序并试图找出 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
}
}
}