Как сделать так, чтобы отображаемое имя отправителя отображалось в JSQMessageViewController?

У меня есть следующая функция, которая вызывается для добавления сообщения:

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

        finishReceivingMessage()

}

Тогда в этой функции

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

Я возвращаю дату сообщения для этого indexPath. Сообщение отображается правильно, но нет отображаемого имени.


person Tob    schedule 14.03.2016    source источник


Ответы (4)


Я думаю, что вам не хватает attributedTextForMessageBubbleTopLabelAtIndexPath, должно выглядеть примерно так

 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)

    }
}

Редактировать:

Также убедитесь, что вы присвоили ярлыку высоту с помощью этой функции.

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

Удачи ????

person Dan Leonard    schedule 16.03.2016
comment
Спасибо, это сработало. Мне просто нужно было добавить еще одну функцию, чтобы указать высоту верхней метки. - person Tob; 17.03.2016
comment
@Tob, не могли бы вы опубликовать функцию, которую вы использовали для указания высоты верхней метки? - person MikeG; 18.04.2016
comment
Вот что я использовал: override func collectionView(collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForCellBottomLabelAtIndexPath indexPath: NSIndexPath!) -> CGFloat { return 15 } - person Tob; 19.04.2016
comment
Просто введите collectionView, и вы сможете прокручивать вниз, пока не найдете heightForCellBottomLabelAtIndexPath (есть также функция для указания высоты верхней метки). - person Tob; 19.04.2016
comment
Для тех, кто хочет, чтобы NSAttributedString отображалось в верхней части сообщения, переопределите метод heightForMessageBubbleTopLabelAtIndexPath. heightForCellBottomLabelAtIndexPath устанавливает высоту над пузырем, но не верхнюю метку пузыря. - person Samuel Rosenstein; 02.06.2016
comment
Спасибо @Tob, я добавил это к ответу. - person Dan Leonard; 28.08.2016
comment
@DanielLeonard Я вижу, что вы знаете, что думаете, когда дело доходит до JSQMessageViewController. Не могли бы вы помочь мне понять, почему у меня нет звука при попытке воспроизвести видеосообщение в JSQMessageViewController? stackoverflow.com/questions/51911924 - person bibscy; 19.08.2018
comment
@bibscy У меня нет опыта работы с этой конкретной реализацией. Но я посмотрю и посмотрю, что я могу сделать. - person Dan Leonard; 20.08.2018
comment
@DanielLeonard Я узнал. Спасибо - person bibscy; 20.08.2018

Новые обновленные методы

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

        }
    }
person Satish Babariya    schedule 19.07.2017
comment
Эй, это именно то, что я искал, однако возникает ошибка. Он возвращает ошибку, говоря, что инициализатор для условной привязки должен иметь необязательный тип, а не String. Как я могу это решить? - person AlexVilla147; 12.09.2017

Обязательно добавьте эту функцию для отображения имени:

 override func collectionView(collectionView: JSQMessagesCollectionView!, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout!, heightForMessageBubbleTopLabelAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
    return 15
}
person Letaief Achraf    schedule 25.08.2016

Вот код для Swift 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
    }
person Manvir Singh    schedule 22.07.2017