问题描述
我正在使用 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 我尝试这样做,以便检查使用行而不是列;仍然得到这种结果:
解决方法
好的,首先,让我们分析一下您的函数 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
}
最后,由于您在 message
中使用了 SenderType,您如何将这些发件人附加到邮件本身?
- 您是否为具有相同数据的每封邮件创建一个新的SenderType?
- 您是否将存储的曾经生成的发件人添加到消息中?
此外,如果您在问题中指明哪些用户应该参与该对话以及哪些消息确实与每个用户相对应,这可能会有所帮助。问题是否发生在他们身上?仅与发件人有关?
我认为您面临的问题不在于 ViewController。