Пользовательская ячейка CollectionView не обновляется правильно, когда активен SearchController - PullRequest
0 голосов
/ 11 марта 2020

У меня есть представление коллекции с контроллером поиска и пользовательской ячейкой. Когда я делаю правку в ячейке, когда поиск не активен, все обновляется без проблем. Но когда контроллер поиска активен, мои изменения не загружаются корректно. Вот некоторые из моих кодов.

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    //SEARCH
    if searchController.isActive{
        return searchResults.count
    }else{
    return products.count
    }
    //SEARCH
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: Identifiers.ProductCell, for: indexPath) as? ProductCell {

        //SEARCH
        // Determine if we get the products from search result or the original array
        let searchItem = (searchController.isActive) ? searchResults[indexPath.item] : products[indexPath.item]

        cell.product = searchItem
        cell.delegate = self

        return cell
    }
    return UICollectionViewCell()
}

У меня есть слушатель для заполнения информации в ячейке для коллекции, и вот мой код для слушателя:

func setProductsListener(){

    listener = ProductsService.getProducts { [weak self] change, product in

        guard let self = self else { return }
        switch change.type {
        case .added:
            self.onDocumentAdded(change: change, product: product)
        case .modified:
            self.onDocumentModified(change: change, product: product)
        case .removed:
            self.onDocumentRemoved(change: change)

        @unknown default: break
        }
    }
}

, и вот где мои изменения загружаются в the collectionView:

    func onDocumentAdded(change: ProductChange, product: Product){
        let newIndex = Int(change.newIndex)
        products.insert(product, at: newIndex)
        collectionView.insertItems(at: [IndexPath(item: newIndex, section: 0)])

        // calculate and set title for cart subtotal
        cartBtn.setTitle(subtotal.penniesToFormattedCurrency(), for: .normal)
        cartBtn.sizeToFit()
    }

    func onDocumentModified(change: ProductChange, product: Product) {

        if change.newIndex == change.oldIndex {

            // Item changed, but remained in the same position
            let index = Int(change.newIndex)
            products[index] = product

            (collectionView.cellForItem(at: IndexPath(item: index, section: 0)) as? ProductCell)?.product = product

            // calculate and set title for cart subtotal
            cartBtn.setTitle(subtotal.penniesToFormattedCurrency(), for: .normal)
            cartBtn.sizeToFit()
        } else {

            // Item changed and changed position
            let oldIndex = Int(change.oldIndex)
            let newIndex = Int(change.newIndex)
            products.remove(at: oldIndex)
            products.insert(product, at: newIndex)

            collectionView.moveItem(at: IndexPath(item: oldIndex, section: 0), to: IndexPath(item: newIndex, section: 0))

            // calculate and set title for cart subtotal
            cartBtn.setTitle(subtotal.penniesToFormattedCurrency(), for: .normal)
            cartBtn.sizeToFit()
        }
    }

    func onDocumentRemoved(change: ProductChange){
        let oldIndex = Int(change.oldIndex)
        products.remove(at: Int(oldIndex))
        collectionView.deleteItems(at: [IndexPath(item: oldIndex, section: 0)])

        // calculate and set title for cart subtotal
        cartBtn.setTitle(subtotal.penniesToFormattedCurrency(), for: .normal)
        cartBtn.sizeToFit()
    }

Вот как выглядит мой пользовательский интерфейс, когда контроллер поиска не активен:

enter image description here

Когда Я начинаю поиск и ввожу слово «As ..» (пытаясь найти спаржу). Я получаю такой результат:

enter image description here

Пока у меня нет проблема. Но как только я пытаюсь нажать на «плюс» или «минус», чтобы изменить количество, когда контроллер поиска активен; неверный индекс также обновляется; посмотрите на скриншот ниже. Не только индекс 0 обновляется для спаржи; Индекс 2 также обновляется, чтобы быть тем же самым, Спаржа.

enter image description here

Я совершенно уверен, что проблема в следующем коде, где после того, как модификация сделана; неверный индекс также обновляется, когда контроллер поиска активен. Любая идея, как я могу изменить код ниже, чтобы правильный индекс обновлялся, когда контроллер поиска активен?

func onDocumentModified(change: ProductChange, product: Product) {

    if change.newIndex == change.oldIndex {

        // Item changed, but remained in the same position
        let index = Int(change.newIndex)
        products[index] = product

        (collectionView.cellForItem(at: IndexPath(item: index, section: 0)) as? ProductCell)?.product = product

        // calculate and set title for cart subtotal
        cartBtn.setTitle(subtotal.penniesToFormattedCurrency(), for: .normal)
        cartBtn.sizeToFit()
    }

1 Ответ

0 голосов
/ 12 марта 2020

Я исправил это, добавив следующее к func onDocumentModified:

        if searchController.isActive {

            for item in searchResults {

                if item.id == product.id {
                    let searchedItemIndex = Int((searchResults.firstIndex(of: item))!)

                    (collectionView.cellForItem(at: IndexPath(item: searchedItemIndex, section: 0)) as? ProductCell)?.product = product
                }
            }

        } else {

            collectionView.reloadItems(at: [IndexPath(item: index, section: 0)])                
        }
...