0

我正在使用MessageKit为我的应用创建聊天界面。

如果多条消息来自同一作者,我目前正在使用他们示例中的此代码来不显示用户的头像:

func configureAvatarView(_ avatarView: AvatarView, for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) {
    let sigil = Sigil(ship: Sigil.Ship(rawValue: message.sender.senderId)!, color: .black).image(with: CGSize(width: 24.0, height: 24.0))
    let avatar = Avatar(image: sigil, initials: "")
        avatarView.set(avatar: avatar)
                avatarView.isHidden = isNextMessageSameSender(at: indexPath)
}

func isNextMessageSameSender(at indexPath: IndexPath) -> Bool {
    guard indexPath.section + 1 < messages.count else { return false }
    return messages[indexPath.section].sender.displayName == messages[indexPath.section + 1].sender.displayName
}

这是 MessageKit 示例应用程序中的样子:

在此处输入图像描述

这是在我的应用程序中使用相同代码的结果:

在此处输入图像描述

编辑

因此,问题似乎出在此处:

func isNextMessageSameSender(at indexPath: IndexPath) -> Bool {
    guard indexPath.section + 1 < messages.count else { return false }
    return messages[indexPath.section].sender.displayName == messages[indexPath.section + 1].sender.displayName
}

但我还没有确切地缩小它是什么

编辑 2 我试着让它检查使用行而不是列;仍然得到这种结果:

在此处输入图像描述

4

1 回答 1

0

好的,首先我们来分析一下你的函数configureAvatarView

func configureAvatarView(_ avatarView: AvatarView, for message: MessageType, at indexPath: IndexPath, in messagesCollectionView: MessagesCollectionView) {
    let sigil = Sigil(ship: Sigil.Ship(rawValue: message.sender.senderId)!, color: .black).image(with: CGSize(width: 24.0, height: 24.0))
    let avatar = Avatar(image: sigil, initials: "")
        avatarView.set(avatar: avatar)
                avatarView.isHidden = isNextMessageSameSender(at: indexPath)
}

从我们那里可以看到,您正在根据发件人的姓名生成一个印记,并且您正在根据该图像创建头像。

正如我们在您分享的第一张图片中看到的那样,这张图片在接收者的第 8 条消息中发生了变化。这让我认为问题可能实际上并不在于图形函数,而在于您如何处理保存MessageType集合的数据结构。

在此处输入图像描述

其次,我看到您使用该sender.senderId属性来设置头像,所以我猜它是一个独特的属性,但之后您使用另一个属性来进行与下一条消息所有权相关的比较:sender.displayName。这背后有什么原因吗?

func isNextMessageSameSender(at indexPath: IndexPath) -> Bool {
    guard indexPath.section + 1 < messages.count else { return false }
    return messages[indexPath.section].sender.displayName == messages[indexPath.section + 1].sender.displayName
}

最后,由于您在 中使用SenderType,您message如何将这些发件人附加到消息本身?

  • 您是否为每条具有相同数据的消息创建一个新的SenderType ?
  • 您是否将存储的曾经生成的发件人添加到消息中?

此外,如果您在问题中指出哪些用户应该参与该对话以及哪些消息确实对应于他们每个人,这可能会有所帮助。他们会出现问题吗?只有发件人?

我认为您面临的问题不在 ViewController 中。

于 2021-03-22T16:42:23.183 回答