删除单元格后,collectionViewCell中的按钮中的索引错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除单元格后,collectionViewCell中的按钮中的索引错误相关的知识,希望对你有一定的参考价值。
我有一个collectionView。每个单元格都包含按钮actionButton
以删除它们。按钮有方法removeItem
通过附加目标删除它们。我有一个数组datas
包含收集的项目。
override func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
super.collectionView(collectionView, willDisplay: cell, forItemAt: indexPath)
guard let cell = cell as? ViewCell else { return }
let index = indexPath.row % datas.count
let item = datas[index]
cell.item = item
cell.actionButton.tag = indexPath.item
cell.actionButton.addTarget(self, action: #selector(removeItem), for: .touchUpInside)
}
我有一个从集合视图中删除项目的方法。
@objc func removeItem(sender: UIButton) {
let indexPath = IndexPath.init(item: sender.tag, section: 0)
self.datas.remove(at: indexPath.item)
collectionView?.deleteItems(at: [indexPath])
}
但是从收集单元删除项后按钮索引没有重新加载。例如,如果我删除索引为[0,0]的第一项,则下一个(第二个)项目变为1-st但它的按钮索引仍为[0,1]。
我做错了什么以及为什么按钮索引没有重新排列?
答案
切勿使用标记来跟踪单元格的索引路径(在集合视图或表视图中)。如您所见,当您可以插入,删除或重新排序单元格时,它会失败。
正确的解决方案是根据集合视图中按钮的位置获取单元格的索引路径。
@objc func removeItem(sender: UIButton) {
if let collectionView = collectionView {
let point = sender.convert(.zero, to: collectionView)
if let indexPath = collectionView.indexPathForItem(at: point) {
self.datas.remove(at: indexPath.item)
collectionView.deleteItems(at: [indexPath])
}
}
}
以上是关于删除单元格后,collectionViewCell中的按钮中的索引错误的主要内容,如果未能解决你的问题,请参考以下文章
从 UITableView 插入/删除单元格后的 IndexPath 错误
即使在删除某些单元格后,仍以与 TableView 单元格相同的顺序将文本字段值保存在数组中
在 UICollectionView 中删除单元格后,如何更新作为 UICollectionViewCell 一部分的按钮标签?