Swift3 JSQMessagesViewController在更新时更新气泡图像颜色

Swift3 JSQMessagesViewController在更新时更新气泡图像颜色,swift3,uicollectionview,uicollectionviewcell,jsqmessagesviewcontroller,Swift3,Uicollectionview,Uicollectionviewcell,Jsqmessagesviewcontroller,我正在使用JSQMessagesViewController,并实现了三种气泡颜色。额外的颜色是用来表示一个未经批准的消息在一个主持聊天室 我正在运行Firebase后端,并在聊天信息条目更改时更新approved标志 一切进展顺利,数据正在实时更改。问题在于聊天泡泡的颜色,无论我做什么,它们都不会改变 我尝试过使布局无效、重新加载数据、直接访问单元格(以只读方式显示),除了离开聊天视图并返回外,似乎没有什么改变颜色 messageRef.observe(.childChange

我正在使用JSQMessagesViewController,并实现了三种气泡颜色。额外的颜色是用来表示一个未经批准的消息在一个主持聊天室

我正在运行Firebase后端,并在聊天信息条目更改时更新approved标志

一切进展顺利,数据正在实时更改。问题在于聊天泡泡的颜色,无论我做什么,它们都不会改变

我尝试过使布局无效、重新加载数据、直接访问单元格(以只读方式显示),除了离开聊天视图并返回外,似乎没有什么改变颜色

        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正在被调用,并在第一次加载时为我工作,但它似乎不适用于重新加载/批量更新等。有趣的是,当我有时间时,我将不得不仔细查看。