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

时间:2017-02-14 15:59:45

标签: swift3 uicollectionview uicollectionviewcell jsqmessagesviewcontroller

我正在使用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
        }
    }
}

1 个答案:

答案 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()来更新颜色。

我希望这会帮助你。如果您有更多问题并继续保持,请告诉我。