如何保持CollectionView单元格返回查看

时间:2017-07-10 04:00:51

标签: ios swift firebase uicollectionview uicollectionviewcell

我有一个CollectionView,其中包含与Firebase数据库中的子项相对应的单元格。我的问题是,当我转向另一个视图,然后转回时,CollectionView单元格消失了。

我有一个cellForItemAt函数:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "playerItem", for: indexPath) as! PlayerCollectionViewCell
    cell.setupViews(parentSize: Int(self.playerCollectionView.frame.width), hostUID: self.currentUID, tempUserName: playerArrayList[indexPath.item])
    cell.layer.cornerRadius = 6
    cell.layer.borderWidth = 2
    return cell
}

我还有另一个代码snippit:

for i in 0..<playerArrayList.count{
    print(playerCollectionView.numberOfItems(inSection: 0))
    //playerCollectionView.insertItems(at: [IndexPath(item: i, section: 0)])
    let cell = playerCollectionView.cellForItem(at: IndexPath(item: i, section: 0)) as! PlayerCollectionViewCell
    cell.tempUserName = playerArrayList[i]
    cell.setupViews(parentSize: Int(self.playerCollectionView.frame.width), hostUID: self.currentUID, tempUserName: playerArrayList[i])
}

我仍然在学习CollectionView如何创建单元格,以及View在睡眠时程序的作用,但我相信我的问题是cellForItemAt函数在第一次创建视图时创建所有单元格并且不会发生再过一次。 我确信这是因为当第一次创建视图时,有三个单元格(数据库中确实存在多少个子单元格),但是当回到同一视图时,没有单元格。 我试图通过删除所有单元格然后重新制作它来解决这个问题。 在代码段中,您可以看到注释行:

playerCollectionView.insertItems(at: [IndexPath(item: i, section: 0)])

然而这给了我错误:

  

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0部分中的项目数无效。更新后的现有部分中包含的项目数(3)必须等于项目数在更新(3)之前包含在该部分中,加上或减去从该部分插入或删除的项目数(插入0,删除1),加上或减去移入或移出该部分的项目数量(0移入,0搬出去。'

我也尝试使用它来创建单元格:

let cell = playerCollectionView.dequeueReusableCell(withReuseIdentifier: "playerItem", for: IndexPath(item: i, section: 0)) as! PlayerCollectionViewCell

但我得到同样的错误。如何在返回视图时重新创建单元格?

2 个答案:

答案 0 :(得分:0)

您想在viewWillAppear方法

中重新加载集合视图

答案 1 :(得分:0)

检查您是否在collectionView(_:numberOfItemsInSection:)对象中实施方法collectionView(_:cellForItemAt:)UICollectionViewDataSource

使用cellForItem访问单元格时,应检查是否确实获得了单元格。该方法仅返回可见单元格。

if let cell = self.playerCollectionView.cellForItem(at: indexPath) as? PlayerCollectionViewCell {
    cell.tempUserName = playerArrayList[i]
    cell.setupViews(parentSize: Int(self.playerCollectionView.frame.width), hostUID: self.currentUID, tempUserName: playerArrayList[i])
}

不应再次插入单元格,而是应该有一个集合视图委托,告知要显示的项目数

override function viewDidLoad() {
    super.viewDidLoad()
    playerCollectionView.dataSource = self
}

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

insertItemsAt方法要求您更新numberOfItemsInSection的返回值以匹配新的项目数。

如果playerArrayList对象需要重新加载,则可以执行该生命周期方法

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // reload
}