我正在使用JSQMessagesViewController,并实现了三种气泡颜色。 额外的颜色旨在指示在仲裁聊天室中未批准的消息。
我正在运行 Firebase 后端,并在聊天消息条目更改时更新已批准的标志。
一切进展顺利,数据正在实时更改。 问题在于聊天气泡颜色,无论我做什么,它们都不会改变。
我尝试使布局无效,重新加载数据,直接访问单元格(只读(,除了离开聊天视图并返回之外,似乎没有任何改变颜色。
messageRef.observe(.childChanged, with: { (snapshot) in
let key = snapshot.key
if let dict = snapshot.value as? [String: AnyObject] {
let approved = (dict["approved"]?.boolValue ?? true)
let indexOfMesage = self.messages.index(where:{$0.key == key})
var message = self.messages[indexOfMesage!]
message.approved = approved
print(message)
self.collectionView.performBatchUpdates({ () -> Void in
self.collectionView.collectionViewLayout.invalidateLayout()
self.collectionView.reloadData()
}, completion:nil)
}
任何帮助将不胜感激。上面的代码只是众多尝试之一。
在下面的回复后添加我的"messageBubbleImageDataForItemAt"呼叫以获取更多信息。
override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! {
let message = messages[indexPath.item] // 1
if message.messageItem.senderId == senderId { // 2
if (message.approved == true){
return outgoingBubbleImageView
}else{
return outgoingUnnaprovedBubbleImageView
}
}else if (self.superUsers.contains(message.messageItem.senderId)){
return incomingAdminBubbleImageView
}else { // 3
if (message.approved == true){
return incomingBubbleImageView
}else{
return incomingUnnapprovedBubbleImageView
}
}
}
使布局无效不会对气泡的颜色执行任何操作。我建议您修改消息数据对象,您所要做的就是符合JSQMessageData
协议,并且我会为消息批准状态添加一个属性。
我将假设您定义了三个不同的消息气泡像这样的东西
var incomingBubble: JSQMessagesBubbleImage!
var outgoingBubble: JSQMessagesBubbleImage!
var approvedBubble: JSQMessagesBubbleImage!
然后在您的视图中确实加载了您实际上定义了它们。
incomingBubble = JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleBlue())
outgoingBubble = JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage(with: UIColor.lightGray)
approvedBubble = JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage(with: UIColor.red)
然后在被覆盖的函数messageBubbleImageDataForItemAt
中,您应该提供要使用的气泡的逻辑。
override func collectionView(_ collectionView: JSQMessagesCollectionView, messageBubbleImageDataForItemAt indexPath: IndexPath) -> JSQMessageBubbleImageDataSource {
//Sent by the current user
if messages[indexPath.item].senderId == self.senderId(){
return outgoingBubble
}
//Check if the message is approved from that property earlier.
if messages[indexPath.item].approved {
return approvedBubble
}
// its just a normal message return incoming message.
return incomingBubble
}
其他明智的做法是,此时您需要从Firebase获取消息是否获得批准。
然后调用self.collectionView.reloadData()
应该更新您的颜色,只要您从 Firebase 中提取了最新的颜色。
我希望这对你有所帮助。如果您还有其他问题,请告诉我并继续前进。🖖🏽