Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios JSQMessages显示测试消息时出现问题_Ios_Swift_Collectionview_Jsqmessagesviewcontroller - Fatal编程技术网

Ios JSQMessages显示测试消息时出现问题

Ios JSQMessages显示测试消息时出现问题,ios,swift,collectionview,jsqmessagesviewcontroller,Ios,Swift,Collectionview,Jsqmessagesviewcontroller,当我添加多条测试消息时,只有两条消息显示在屏幕上。其他的信息很清楚,因为我可以复制它们,但是颜色根本没有显示出来。当我滚动时,会出现新的两个文本,但仍然只有两个。下面是一些例子 第一个屏幕截图显示屏幕首次加载的时间。当我移动它时,第二个显示。第三,显示其他消息确实存在,但不可见。有没有办法解决这个问题?另外,我如何使名称出现?在Swift中是否有这样做的好指南 以下是我使用的代码: var messages = [JSQMessage]() var incomingBubbleI

当我添加多条测试消息时,只有两条消息显示在屏幕上。其他的信息很清楚,因为我可以复制它们,但是颜色根本没有显示出来。当我滚动时,会出现新的两个文本,但仍然只有两个。下面是一些例子

第一个屏幕截图显示屏幕首次加载的时间。当我移动它时,第二个显示。第三,显示其他消息确实存在,但不可见。有没有办法解决这个问题?另外,我如何使名称出现?在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.removateIndex(indexPath.row)

}


任何帮助都将不胜感激

您需要在将消息添加到数据源后调用
self.finishReceivingMessage()
(然后在调用
collectionView.reloadData()之前使布局无效)

您应该在重新加载数据之前使布局无效。我不确定swift中的等效项,但在Objective-C中,您可以这样做:
[self.collectionView.collectionViewLayoutInvalidateLayoutWithContext:[JSQMessageCollectionViewFlowLayoutValidationContext][self.collectionView reloadData]之前的code>我试过了,但没有解决问题。这就是
jsqMessageViewController
子类的全部代码吗?您是否实现了
viewwillbeen
和/或
viewdidebeen
如果是,您能否检查您是否调用了相应的
[super-viewwillbeen:animated]
[super-viewdidebeen:animated]
swift对应项?顺便问一下,关于姓名问题的另一部分,您可以从
jsqMessageCollectionViewDataSource
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
}