我有一个显示聊天消息的 tableView
。我想在作为新日期(天)的第一条消息的每条消息之前插入一个日期分隔符。因此,我创建了一个 label
并将其添加到聊天消息 View 并调整了约束条件。但是我的方法是重新绘制我插入的 label
View :
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Chat Message", for: indexPath) as! ChatViewCellView
cell.myChatView.Text = self.messageData[self.messageIndex!].messages[indexPath.item]
let dateLabel:UILabel = createDateSep(date: self.messageData[self.messageIndex!].message_dates[indexPath.item])
cell.myChatView.addSubview(dateLabel)
let labelConstraint = NSLayoutConstraint(item: cell.myChatViewReceived.nameView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: dateLabel, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 18)
labelConstraint.identifier = "dateSeparatorIdentifier"
NSLayoutConstraint.activate([labelConstraint])
}
(createDateSep
只是我用来格式化日期字符串的函数。)
为 tableView 提供数据的服务提供了两个数组,一个包含文本 messages
,另一个包含日期 (message_dates
)。
我从概念上理解为什么在滚动期间重新创建 View ,但它从保存日期的数组中取出不同的日期值并将它们绘制在同一位置。我不知道为什么会这样,我也不知道如何防止重绘,即使日期字符串都是相同的、正确的值。任何解决方案都必须与 iOS 9 兼容。我有单独的 Xibs
这是它的样子(注意日期是 11 月 22 日和 12 月 26 日,而 12 月 26 日是正确的):
最佳答案
您的问题的答案是:单元格被重复使用,这意味着您每次都添加另一个“日期分隔符标签”。
我的建议是:
- 将“日期分隔符标签”添加到您的“已接收”和“已发送”XIB。
- 从“名称/时间”标签的顶部添加两个约束 - 一个在“日期分隔符标签”的底部,一个在内容 View 的顶部。
- 在您的单元格类中通过
IBOutlet
连接它们。命名一个dateVisibleConstraint
和另一个dateHiddenConstraint
- 将
dateVisibleConstraint
的优先级设置为High (750)
,将dateHiddenConstraint
的优先级设置为Low (250) )
- 在运行时,根据日期标签是隐藏还是显示来调整优先级值。
我在这里发布了一个完整的例子:https://github.com/DonMag/ChatLayout
输出:
并且,在一些滚动之后:
关于ios - 如何避免 iOS/Swift tableView 中的重复 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59630060/