Swift3 JSQMessagesViewController在更新时更新气泡图像颜色
我正在使用JSQMessagesViewController,并实现了三种气泡颜色。额外的颜色是用来表示一个未经批准的消息在一个主持聊天室 我正在运行Firebase后端,并在聊天信息条目更改时更新approved标志 一切进展顺利,数据正在实时更改。问题在于聊天泡泡的颜色,无论我做什么,它们都不会改变 我尝试过使布局无效、重新加载数据、直接访问单元格(以只读方式显示),除了离开聊天视图并返回外,似乎没有什么改变颜色Swift3 JSQMessagesViewController在更新时更新气泡图像颜色,swift3,uicollectionview,uicollectionviewcell,jsqmessagesviewcontroller,Swift3,Uicollectionview,Uicollectionviewcell,Jsqmessagesviewcontroller,我正在使用JSQMessagesViewController,并实现了三种气泡颜色。额外的颜色是用来表示一个未经批准的消息在一个主持聊天室 我正在运行Firebase后端,并在聊天信息条目更改时更新approved标志 一切进展顺利,数据正在实时更改。问题在于聊天泡泡的颜色,无论我做什么,它们都不会改变 我尝试过使布局无效、重新加载数据、直接访问单元格(以只读方式显示),除了离开聊天视图并返回外,似乎没有什么改变颜色 messageRef.observe(.childChange
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
}
}
}
使布局无效不会对气泡的颜色产生任何影响。我建议您修改messageDataObject,您所要做的就是遵守
JSQMessageData
协议,我将为messages审批状态添加一个属性
我假设您定义了三个不同的消息气泡
像这样的
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中提取了最新的颜色
我希望这对你有帮助。如果您有更多问题,请告诉我,并继续。这与我的非常接近,我没有找到JSQMessageData协议中列出的messageBubbleImageDataForItemAt。我使用的是非常类似的东西,您不需要遵守JSQMessageData协议。messageBubbleImageDataForItemAt正在被调用,并在第一次加载时为我工作,但它似乎不适用于重新加载/批量更新等。有趣的是,当我有时间时,我将不得不仔细查看。