我正在使用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
}
}
}
答案 0 :(得分:0)
布局无效不会对气泡的颜色起任何作用。我建议您修改messageDataObject所有你必须做的是符合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获取。
只要您从firebase中提取最新信息,就可以调用self.collectionView.reloadData()
来更新颜色。
我希望这会帮助你。如果您有更多问题并继续保持,请告诉我。