在单元indexPath方面,.reloadData()幕后发生了什么?

时间:2018-03-11 03:56:18

标签: ios swift uicollectionview uicollectionviewcell

我正在使用集合视图,每次选择单元格时,我都会将单元格背景颜色更改为红色。很简单:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)! as! CustomCell
    cell.backgroundColor = .red
}

这绝对没问题。当我从左到右选择前三个单元格时,背景颜色会像我预期的那样发生变化:

enter image description here

但是,如果我在选择单元格后重新加载collectionView,则选择顺序开始表现得很奇怪。当我从左到右以相同的顺序选择相同的前3个单元格时,将选择不同的单元格:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.cellForItem(at: indexPath)! as! CustomCell
    cell.backgroundColor = .red
    collectionView.reloadData()
}

enter image description here

Apple的文档很神秘。 https://developer.apple.com/documentation/uikit/uicollectionview/1618078-reloaddata

他们说"这会导致集合视图丢弃任何当前可见的项目(包括占位符),并根据数据源对象的当前状态重新创建项目。 "但这让我觉得在调用reloadData()时,collectionViewCells将返回灰色而不会跳转indexPaths。

任何人都可以解释reloadData()中发生的事情,使索引路径排序的单元格选择如此奇怪吗?

1 个答案:

答案 0 :(得分:-1)

首先你需要使用出队单元

let cell = collectionView.dequeueReusableCell(withReuseIdentifier:"CustomCell", for: indexPath) as! CustomCell

在单元格中,您可以使用

-(void)prepareForReuse {
  // Set default implementation 

}