如何从UICollectionView正确删除单元格?

时间:2019-04-15 13:51:22

标签: ios swift uicollectionview

我正在尝试删除单元格形式的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
}

即使我在网上找到的都是相同的解决方案,我仍然得到相同的结果。

5 个答案:

答案 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])
            }
        }
    }
}