ios - 如何避免 iOS/Swift tableView 中的重复 subview

标签 ios swift xcode

我有一个显示聊天消息的 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 日是正确的):

enter image description here

最佳答案

您的问题的答案是:单元格被重复使用,这意味着您每次都添加另一个“日期分隔符标签”。

我的建议是:

  • 将“日期分隔符标签”添加到您的“已接收”和“已发送”XIB。
  • 从“名称/时间”标签的顶部添加两个约束 - 一个在“日期分隔符标签”的底部,一个在内容 View 的顶部。
  • 在您的单元格类中通过 IBOutlet 连接它们。命名一个 dateVisibleConstraint 和另一个 dateHiddenConstraint
  • dateVisibleConstraint 的优先级设置为 High (750),将 dateHiddenConstraint 的优先级设置为 Low (250) )
  • 在运行时,根据日期标签是隐藏还是显示来调整优先级值。

我在这里发布了一个完整的例子:https://github.com/DonMag/ChatLayout

输出:

enter image description here

并且,在一些滚动之后:

enter image description here

关于ios - 如何避免 iOS/Swift tableView 中的重复 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59630060/

相关文章:

ios - 字典中数组的索引错误(Swift 3.0)

ios - 苹果手机配置文件

ios - 需要检查 UITextField 是否包含两个(并且只有两个)iOS 中每个最少 2 个字符的字符串

ios - 如何从另一个容器 View 访问容器 View ?

iphone - 在我的主视图中将 UIImageView 置于其他 UIImageView 之上

iphone - 具有 setDelegate 和 action 的 UIGestureRecognizer

android - 功能来知道是平板电脑,iPad,智能手机?

ios - 如何从分组条形图切换到简单条形图

ios - 重新加载 Collection View 数据时对成员 'collectionView(_:numberOfItemsInSection:)' 的引用不明确

验证时 iOS 分发证书未连接