0

我正在使用JSQMessagesViewController並實現了三種氣泡顏色。額外的顏色被設計爲在主持聊天室中顯示未經批准的消息。JSQMessagesViewController在更新時更新氣泡圖像顏色

我正在運行Firebase後端並在聊天消息條目發生更改時更新批准的標誌。

一切進展順利,數據正在實時更改。問題在於聊天泡泡的顏色,不管我做什麼,它們都不會改變。

我已經試過無效佈局,reloaddata,直接接入小區(大作只讀)和似乎沒有任何改變不是離開聊天視圖和回來其他的顏色。

 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

使佈局無效將不會對氣泡的顏色做任何事情。我建議你修改你的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中獲取此時的信息。

然後調用self.collectionView.reloadData()只要你有拉從火力的最新需要更新你的顏色。

我希望這可以幫助你。讓我知道你是否有更多的問題,並繼續保持。

+0

這是非常接近我有什麼,我沒有找到在JSQMessageData協議列出的messageBubbleImageDataForItemAt。 – Beland

+0

我使用非常類似的東西,你不需要符合JSQMessageData協議。 messageBubbleImageDataForItemAt被調用,併爲我工作的第一負載,但它似乎並沒有對重載/批量更新等工作 – Beland

+0

有趣的,我將不得不仔細看時,我有一段時間了。 –