У меня есть представление коллекции с контроллером поиска и пользовательской ячейкой. Когда я делаю правку в ячейке, когда поиск не активен, все обновляется без проблем. Но когда контроллер поиска активен, мои изменения не загружаются корректно. Вот некоторые из моих кодов.
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()
}
Вот как выглядит мой пользовательский интерфейс, когда контроллер поиска не активен:
Когда Я начинаю поиск и ввожу слово «As ..» (пытаясь найти спаржу). Я получаю такой результат:
Пока у меня нет проблема. Но как только я пытаюсь нажать на «плюс» или «минус», чтобы изменить количество, когда контроллер поиска активен; неверный индекс также обновляется; посмотрите на скриншот ниже. Не только индекс 0 обновляется для спаржи; Индекс 2 также обновляется, чтобы быть тем же самым, Спаржа.
Я совершенно уверен, что проблема в следующем коде, где после того, как модификация сделана; неверный индекс также обновляется, когда контроллер поиска активен. Любая идея, как я могу изменить код ниже, чтобы правильный индекс обновлялся, когда контроллер поиска активен?
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()
}