2016-03-14 10 views
6

Ich habe die folgende Funktion, die für das Hinzufügen einer Nachricht aufgerufen wird:Wie lässt sich der Name des Absenders mit JSQMessageViewController anzeigen?

func addMessage(text: String, displayName: String) { 
     let message = JSQMessage(senderId: "tester", displayName: displayName, text: text) 
     messages.append(message) 

     finishReceivingMessage() 

} 

Dann in dieser Funktion

override func collectionView(collectionView: JSQMessagesCollectionView!, 
    messageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageData! { 
     return messages[indexPath.item] 
} 

Ich kehre das Nachrichtendatum für diese indexPath. Die Nachricht wird korrekt angezeigt, aber es gibt keinen Anzeigenamen.

Antwort

3

Neu Aktualisiert Methoden

override func collectionView(_ collectionView: JSQMessagesCollectionView!, attributedTextForMessageBubbleTopLabelAt indexPath: IndexPath!) -> NSAttributedString! 
    { 
     let message = messages[indexPath.item] 

     if message.senderId == senderId { 
      return nil 
     } else { 
      guard let senderDisplayName = message.senderDisplayName else { 
       assertionFailure() 
       return nil 
      } 
      return NSAttributedString(string: senderDisplayName) 

     } 

    } 

    override func collectionView(_ collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForMessageBubbleTopLabelAt indexPath: IndexPath!) -> CGFloat 
    { 
     //return 17.0 
     let message = messages[indexPath.item] 

     if message.senderId == senderId { 
      return 0.0 
     } else { 

      return 17.0 

     } 
    } 
+0

Dies funktionierte perfekt für mich – Sente

+0

Hey, das ist genau das, was ich suchte, aber es tritt ein Fehler auf. Es gibt einen Fehler zurück, der besagt, dass der Initialisierer für die bedingte Bindung einen optionalen Typ haben muss, nicht String. Wie kann ich das lösen? – AlexVilla147

14

Ich glaube, Sie die attributedTextForMessageBubbleTopLabelAtIndexPath fehlen sollte so etwas wie dieses

override func collectionView(collectionView: JSQMessagesCollectionView?, attributedTextForMessageBubbleTopLabelAtIndexPath indexPath: NSIndexPath!) -> NSAttributedString! { 
    let message = messages[indexPath.item] 
    switch message.senderId { 
    case CURRENTUSERID: 
     return nil 
    default: 
     guard let senderDisplayName = message.senderDisplayName else { 
      assertionFailure() 
      return nil 
     } 
     return NSAttributedString(string: senderDisplayName) 

    } 
} 

bearbeiten aussehen:

Auch stellen Sie sicher, dass das Etikett eine Höhe mit dieser Funktion

override func collectionView(collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForMessageBubbleTopLabelAtIndexPath indexPath: NSIndexPath!) -> CGFloat { 
    return 13 //or what ever height you want to give 
}  

Good Luck geben

+1

Dank es funktionierte. Ich musste nur eine weitere Funktion hinzufügen, um die Höhe des oberen Etiketts anzugeben. – Tob

+0

genial. Würdest du die Antwort akzeptieren? :) –

+0

@Tob könnten Sie bitte die Funktion posten, mit der Sie die Höhe des oberen Etiketts angegeben haben? Diese – MikeG

0

Stellen Sie sicher, dass diese Funktion hinzugefügt wird, um angezeigt zu werden der Name:

override func collectionView(collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForMessageBubbleTopLabelAtIndexPath indexPath: NSIndexPath!) -> CGFloat { 
    return 15 
} 
0

Hier ist der Code für eine schnelle 3

override func collectionView(_ collectionView: JSQMessagesCollectionView!, attributedTextForMessageBubbleTopLabelAt indexPath: IndexPath!) -> NSAttributedString! { 
     return NSAttributedString(string: senderDisplayName) 
    } 

    override func collectionView(_ collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForMessageBubbleTopLabelAt indexPath: IndexPath!) -> CGFloat { 
     return 15 //your height 
    } 
Verwandte Themen