我正在尝试删除单元格形式的UICollectionView,但出现“无效更新”错误
'无效更新:第0节中的无效项数。更新(9)之后现有节中包含的项数必须等于更新(9)前该节中包含的项数,再加上或减去从该部分插入或删除的项目数(插入0,删除1),再加上或减去移入或移出该部分的项目数(移入0,移出0)。'
,并且在从CollectionView中删除项目之前,我尝试更新DataModel,但这没有用。
这是我的代码:
func didChangeQunatityOfCartProductAt(index: IndexPath?, product: ItemsModel?) {
if let quantity = product?.quantity{
if let indexPath = index{
if quantity == 0{
self.products.remove(at: indexPath.row)
self.collectionView.deleteItems(at: [indexPath])
}
}
}
}
这是我的numberOfItemsInSection函数:
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return products.count
}
即使我在网上找到的都是相同的解决方案,我仍然得到相同的结果。
答案 0 :(得分:1)
我发现了问题,删除索引处的项目后,我正在自动重新加载收集视图,其中products数组在类顶部具有一个属性观察器,用于重新加载收集视图,并在移除它后修复了问题
答案 1 :(得分:0)
您可以尝试从dataSource数组中删除数据,然后调用reloadData方法“刷新”您的collectionViewDatasource
func didChangeQunatityOfCartProductAt(index: IndexPath?, product: ItemsModel?) {
if let quantity = product?.quantity {
if let indexPath = index {
if quantity == 0 {
self.products.remove(at: indexPath.row)
self.collectionView.reloadData()
}
}
}
}
这里唯一的区别是替换了以下单元格的去除:
self.collectionView.reloadData()
答案 2 :(得分:0)
您应该从array(Products)中删除indexPath.item,因为它是由indexPath.row组成的collectionview。
func didChangeQunatityOfCartProductAt(index: IndexPath?, product: ItemsModel?) {
if let quantity = product?.quantity{
if let indexPath = index {
if quantity == 0 {
DispatchQueue.global(qos: .userInteractive).async { [weak self] in
self.products.remove(at: indexPath.item)
DispatchQueue.main.async { [weak self] in
self?.collectionView.deleteItems(at: [indexPath])
self?.collectionView.reloadData() // or you can reload the specific indexPath
}
}
}
}
}
答案 3 :(得分:0)
您应尝试使用collectionview的performBatchUpdates(_:completion:)
func didChangeQunatityOfCartProductAt(index: IndexPath?, product: ItemsModel?) {
if let quantity = product?.quantity {
if let indexPath = index {
if quantity == 0 {
self.products.remove(at: indexPath.row)
self.collectionView.performBatchUpdates({
self.collectionView.deleteItems(at: [indexPath])
}){
// optional closure
}
}
}
}
}
答案 4 :(得分:0)
如果您的产品数量为0,如何删除产品? 您应该从该代码中删除self.products.remove,因为该产品已不存在。
func didChangeQunatityOfCartProductAt(index: IndexPath?, product: ItemsModel?) {
if let quantity = product?.quantity{
if let indexPath = index{
if quantity == 0{
self.collectionView.deleteItems(at: [indexPath])
}
}
}
}