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 
} 

Другое, что нужно, чтобы получить из базы огня в этот момент, если сообщение одобрено или нет.

Затем звонок self.collectionView.reloadData() должен обновлять цвета до тех пор, пока вы вытащили последнюю из базы.

Я надеюсь, что это поможет вам. Сообщите мне, есть ли у вас больше вопросов и продолжайте держать.

+0

Это очень близко к тому, что у меня есть, я не нахожу сообщениеBubbleImageDataForItemAt, указанное в протоколе JSQMessageData. – Beland

+0

Я использую нечто очень похожее, вам не нужно соответствовать протоколу JSQMessageData. messageBubbleImageDataForItemAt вызывается и работает для меня при первом загрузке, но он, похоже, не работает для перезагрузки/пакетного обновления и т. д. – Beland

+0

Интересно, мне нужно будет присмотреться, когда у меня будет время. –

Смежные вопросы