UIcollectionview在Swift 3中多次重复最后一个单元格

时间:2017-08-01 09:19:04

标签: arrays swift loops asynchronous uicollectionview

我正在尝试通过填充从聊天室聊天SDK获取的所有消息来实现聊天日志控制器,并将它们填充到消息数组中:var messages = [Message]()。因此我实现了以下功能:

func observeMessages() {

    let modelmessage = Message()

    //case of chat inside an Open Channel
    if openChannel != nil {
        SBDOpenChannel.getWithUrl((openChannel?.channelUrl)!) { (channel, error) in
            let previousMessageQuery = channel?.createPreviousMessageListQuery()
            previousMessageQuery?.loadPreviousMessages(withLimit: 100, reverse: false, completionHandler: { (messages, error) in
                for message in messages!{

                    if let usermessage = message as? SBDUserMessage {

                    modelmessage.fromId = usermessage.sender?.nickname
                    //print (modelmessage.fromId)
                    modelmessage.text = usermessage.message!
                    modelmessage.timestamp = usermessage.createdAt
                    self.messages.append(modelmessage)
                    print ("////")
                        for element in self.messages {
                            print(element.text)
                        }

                    }

                }
                DispatchQueue.main.async(execute: {

                    self.collectionView?.reloadData()
                })


            })


        }
    }

    //Case of a 1 on 1 chat
    else {

    }

}

以及负责填充UICollectionView的以下函数。

override func viewDidLoad() {
    super.viewDidLoad()

    collectionView?.backgroundColor = UIColor.white
    collectionView?.register(ChatMessageCell.self, forCellWithReuseIdentifier: cellId)

    setupInputComponents()
}



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

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! ChatMessageCell


    let message = self.messages[indexPath.item]

    cell.textView.text = message.text

    return cell
}

当我尝试打印messages数组时,我意识到它被当前索引的元素填充到索引中的数字,所以我得到了例如:

////
Optional("Aaa")
////
Optional("Hello")
Optional("Hello")
////
Optional("Hello World")
Optional("Hello World")
Optional("Hello World")

.
.
.
//Until I complete 16 iterations so I get

////
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")
Optional("Bye")

1 个答案:

答案 0 :(得分:2)

我觉得重新加载集合视图单元格的地方是错误的。 只需注释" self.collectionView?.reloadData()"看看它是否有所改变。

更新:

因为你写了这个"让modelmessage = Message()"在完成处理程序之外,所有值都引用同一个实例,因此每次都会被覆盖。只需在完成处理程序中移动它,您的问题就会得到解决。干杯