Как правильно удалить ячейку из UICollectionView? - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь удалить форму ячейки UICollectionView, но у меня появляется ошибка для "Invalid Updates"

'Неверное обновление: недопустимое количество элементов в разделе 0. Количество элементов, содержащихся в существующем разделе после обновления (9), должно быть равно количеству элементов, содержащихся в этом разделе до обновления (9), плюс или минус количество элементов, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено) и плюс или минус количество элементов, перемещенных в или из этого раздела (0 перемещено, 0 перемещено). '

и я попытался обновить мою DataModel перед удалением элементов из CollectionView, но это не сработало.

вот мой код:

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 ]

1 голос
/ 15 апреля 2019

Я обнаружил проблему, я автоматически перезагружал представление коллекции после удаления элемента по индексу, где массив products имеет наблюдателя свойства в верхней части класса, который перезагружает представление коллекции, и после удаления его, исправляющегопроблема

0 голосов
/ 15 апреля 2019

Если у вас 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])
            }
        }
    }
}
0 голосов
/ 15 апреля 2019

Вы должны удалить indexPath.item из массива (Products), так как это представление коллекции, инсталлированное в indexPath.row.

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
                    }
            }
        }
    }
}
0 голосов
/ 15 апреля 2019

Вы должны попробовать коллекцию 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
                  }
            }
        }
    }
}
0 голосов
/ 15 апреля 2019

Вы можете попробовать удалить данные из массива 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...