我正在UICollectionViewCell
上为我的移动应用程序工作。轻按crossBtn
时,它应该转到第一个UICollectionViewCell
并重新加载数据,但是collectionView?.reloadData()
会使颜色混乱,并且每个单元格一次都不会停留一种颜色。相反,即使我在UIColor.clear
方法中将颜色设置为didDeselectItemAt
,它仍然在单元格上显示多种颜色。
当用户在不重新加载整个UICollectionViewCell
的情况下点击crossBtn
时,如何返回第一个UICollectionView
项目?
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return filters.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! CollectionViewCell
cell.hamburgerLabel.text = filters[indexPath.item]
// cell.hamburgerImageView.image = filterImages[indexPath.item]
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.layer.backgroundColor = UIColor.gray.cgColor
setFilter(title: filterNames[indexPath.row])
toolBar.isHidden = true
yesAndNoToolBar.isHidden = false
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.layer.backgroundColor = UIColor.clear.cgColor
collectionView.deselectItem(at: indexPath, animated: true)
}
@IBAction func crossBtn(_ sender: UIBarButtonItem) {
toolBar.isHidden = false
yesAndNoToolBar.isHidden = true
collectionView?.reloadData()
let indexPath = self.collectionView.indexPathsForSelectedItems?.last ?? IndexPath(item: 0, section: 0)
self.collectionView.selectItem(at: indexPath, animated: false, scrollPosition: UICollectionViewScrollPosition.centeredVertically)
}
答案 0 :(得分:0)
您可能不必重新加载数据。您可以使用以下方法滚动到给定的索引路径。
let indexPath = self.collectionView.indexPathsForSelectedItems?.last ?? IndexPath(item: 0, section: 0)
func scrollToItem(at indexPath: indexPath,
at scrollPosition: .centeredVertically,
animated: true)
请注意,这与使用selectItem(at:animated:scrollPosition:)
不同。
此外,您应该在cellForItem
方法中而不是在选择和取消选择委托方法中设置遇到问题的颜色等。这是因为单元格已被重用,所以在滚动时,您正在设置样式的单元格将在其他位置使用。而是使用选择和取消选择方法将所选索引路径存储在变量(或多个数组)中,然后在cellForItem
中检查此数组,以确定是否将所选样式应用于该单元格。这就是collectionView.reloadData()
为您搞砸的原因!