我正在显示接收者的发件人姓名。但是,我不想在人发送的每个文本上显示名称。例如,如果他/她连续发送消息,我只是希望它在第一条消息的顶部显示名称。我将在这里提供我的聊天截图:
换句话说,我只是希望它在他/她发送的“第一个”消息上显示用户的名字。我试图在attributedTextForMessageBubbleTopLabelAt
没有运气的情况下解决这个问题。
我试图检查上一条消息的senderId是否等于之前的senderId - 然后以某种方式查明是否可以显示它。但是,这导致许多失败的尝试失败,索引超出范围,只是没有工作解决方案。
这是我现在的代码:
let message = messages[indexPath.item]
switch message.senderId {
case FIRAuth.auth()!.currentUser!.uid:
return nil
break
default:
guard let senderDisplayName = message.senderDisplayName else {
assertionFailure()
return nil
}
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = NSTextAlignment.left
let attributedString = NSAttributedString(string: message.senderDisplayName,
attributes: [
NSParagraphStyleAttributeName: paragraphStyle,
NSBaselineOffsetAttributeName: NSNumber(value: 0)
])
return attributedString
break
}
答案 0 :(得分:0)
首次查看时,首先要解决这个问题。我们需要做的是确定消息是否是一组消息中的第一个消息。所以我创建了一个函数来确定消息是否是该人发送的第一个消息。
private func firstMessageInSet(indexOfMessage: IndexPath) -> Bool {
return messages[safe: indexOfMessage.item - 1]?.senderId() == messages[safe: indexOfMessage.item]?.senderId()
}
它只是检查以前的消息senderId
,看它是否与当前消息相同。
然后用这种方法叫那个人:
override func collectionView(_ collectionView: JSQMessagesCollectionView!, attributedTextForMessageBubbleTopLabelAt indexPath: IndexPath!) -> NSAttributedString! {
guard let message = messages[safe: indexPath.item] else { return nil }
return firstMessageInSet(indexOfMessage: indexPath) ? nil : NSAttributedString(string: message.senderDisplayName)
}
这将检查它是否是集合中的第一个,以及它是否返回senderDisplayName。现在这是用短手但最终与
相同if firstMessageInSet(indexOfMessage: indexPath) {
return NSAttributedString(string: message.senderDisplayName)
} else {
return nil
}
希望这能帮助你带来好运