Проблема с отображением тестовых сообщений JSQMessages

Когда я добавляю несколько тестовых сообщений, на экране отображаются только два из них. Другие сообщения явно присутствуют, потому что я могу их скопировать, но цвета просто не отображаются. Когда я прокручиваю, появляются два новых текста, но их все еще только два. Ниже приведены некоторые примеры.

Это изображение отображается при первой загрузке экрана.

Это изображение показывает экран после того, как я немного прокрутил его.

На этом изображении видно, что сообщения четко видны, но всплывающие подсказки не отображаются.

Первый скриншот показывает, когда экран загружается впервые. второй показывает, когда я перемещаю его. Третий показывает, что другие сообщения существуют, но не видны. Любые идеи о том, как это исправить? Кроме того, как мне сделать, чтобы имена отображались? Есть ли хорошее руководство по этому в Swift?

Вот код, который я использовал:

    var messages = [JSQMessage]()

var incomingBubbleImageView = JSQMessagesBubbleImageFactory.incomingMessageBubbleImageViewWithColor(UIColor.jsq_messageBubbleLightGrayColor())
var outgoingBubbleImageView = JSQMessagesBubbleImageFactory.outgoingMessageBubbleImageViewWithColor(UIColor.jsq_messageBubbleGreenColor())

override func viewDidLoad() {
    super.viewDidLoad()

    self.sender = UIDevice.currentDevice().identifierForVendor?.UUIDString

    messages += [JSQMessage(text: "hello", sender: self.sender)]
    messages += [JSQMessage(text: "hello", sender: "other")]
    messages += [JSQMessage(text: "hello", sender: self.sender)]
    messages += [JSQMessage(text: "hello", sender: "other")]
    messages += [JSQMessage(text: "hello", sender: self.sender)]
    messages += [JSQMessage(text: "hello", sender: "other")]

    reloadMessagesView()

}

func reloadMessagesView() {
    self.collectionView?.reloadData()
}

А вот код расширения для методов делегата:

extension TestJSQ {

override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    print(self.messages.count)
    return self.messages.count
}

override func collectionView(collectionView: JSQMessagesCollectionView!, messageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageData! {
    let data = self.messages[indexPath.row]
    return data
}

// переопределить func collectionView(collectionView: JSQMessagesCollectionView!, didDeleteMessageAtIndexPath indexPath: NSIndexPath!) { // self.messages.removeAtIndex(indexPath.row)

override func collectionView(collectionView: JSQMessagesCollectionView, bubbleImageViewForItemAtIndexPath indexPath: NSIndexPath) -> UIImageView {

    let data = messages[indexPath.row]
    switch(data.sender) {
    case self.sender:
        return self.outgoingBubbleImageView
    default:
        return self.incomingBubbleImageView
    }

    }

override func collectionView(collectionView: JSQMessagesCollectionView!, avatarImageViewForItemAtIndexPath indexPath: NSIndexPath!) -> UIImageView! {
    return nil
}

}

Любая помощь приветствуется!!!


person Sampath Duddu    schedule 17.03.2016    source источник
comment
Вы должны аннулировать макет перед повторной загрузкой данных. Я не уверен насчет эквивалента в Swift, но в Objective-C вы делаете: [self.collectionView.collectionViewLayout invalidateLayoutWithContext:[JSQMessagesCollectionViewFlowLayoutInvalidationContext context]]; перед вызовом [self.collectionView reloadData];   -  person Gianni Carlo    schedule 22.03.2016
comment
Я пробовал это, но это не решило проблему.   -  person Sampath Duddu    schedule 23.03.2016
comment
Это весь код вашего подкласса JSQMessagesViewController? Вы реализуете viewWillAppear и/или viewDidAppear, если да, можете ли вы проверить, вызываете ли вы соответствующий аналог Swift [super viewWillAppear:animated] или [super viewDidAppear:animated]?   -  person Gianni Carlo    schedule 23.03.2016
comment
Кстати, для другой части вашего вопроса об именах вы можете использовать collectionView:attributedTextForMessageBubbleTopLabelAtIndexPath: метод из JSQMessagesCollectionViewDataSource   -  person Gianni Carlo    schedule 23.03.2016


Ответы (1)


Вам нужно вызвать self.finishReceivingMessage() после того, как вы добавите сообщение (я) в источник данных (что затем сделает макет недействительным ПЕРЕД вызовом collectionView.reloadData() для вас)

person Tran Dinh Tung    schedule 16.03.2018