我有一个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
但我得到同样的错误。如何在返回视图时重新创建单元格?
答案 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
}