0

JSQMessagesViewControllerを使用していて、3つのバブルカラーを実装しました。余分な色は、モデレートされたチャットルームで承認されていないメッセージを示すように設計されています。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

バブルの色については、レイアウトを無効にしても何も起こりません。私はあなたがメッセージの承認ステータスのプロパティを追加するだろうJSQMessageDataプロトコルに準拠する必要があるすべてのあなたがあなたのmessageDataObjectを変更することをお勧めします。

私は、あなたは、3件の異なるメッセージがこの

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()を呼び出して色を更新する必要があります。

私はこれがあなたを助けてくれることを願っています。あなたに多くの質問があり、それを維持し続けるなら、私に知らせてください。

+0

これは私が持っているものに非常に近く、JSQMessageDataプロトコルにリストされているmessageBubbleImageDataForItemAtを見つけることができません。 – Beland

+0

私は非常に似たようなものを使用していますが、JSQMessageDataプロトコルに準拠する必要はありません。 messageBubbleImageDataForItemAtが呼び出され、最初の負荷で私のために働いていますが、リロード/バッチ更新などのためには動作していないようです。 – Beland

+0

面白いことに、時間があると面白いです。 –

関連する問題