Método PerformBatchUpdate en la vista de colección eliminando la celda en el índice incorrecto.
Estoy utilizando PerformBatchUpdate para eliminar una única celda de la collectionView. El problema es que si intento eliminar la primera celda (fila 0), la elimina correctamente. Pero si intento eliminar nuevamente la primera celda (celda actualizada que estaba en la fila 1 y ahora está en la fila 0), elimina la celda que está actualmente en la fila 1 en lugar de eliminar la celda en la fila 0.
Nota: Por favor, sugiera la respuesta utilizando SOLO PerformBatchUpdate.
Estoy usando este código
private var movieViewModels = [movieViewModel]()
Protocolos de la collectionView
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if isFiltering {
return filteredMovies.count
}
return movieViewModels.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if isFiltering {
return customiseCell(Arr: filteredMovies, index: indexPath, collectionView: collectionView)
} else {
return customiseCell(Arr: movieViewModels, index: indexPath, collectionView: collectionView)
}
}
Código para eliminar la celda
func deleteMoviewhenFilterOFF(index:IndexPath){
self.movieViewModels.remove(at: index.row)
self.clctnView.performBatchUpdates {
self.clctnView.deleteItems(at: [index])
} completion: { success in
print("actualización exitosa")
}
}
NOTA: Funciona bien si vuelvo a cargar la colección en BatchUpdate usando el siguiente código, pero creo que PerformBatchUpdate hace esto automáticamente y no se recomienda volver a cargar la colección en la actualización por lotes.
func deleteMoviewhenFilterOFF(index:IndexPath){
self.movieViewModels.remove(at: index.row)
self.clctnView.performBatchUpdates {
self.clctnView.deleteItems(at: [index])
} completion: { success in
print("actualización exitosa")
self.clctnView.reloadData()
}
}
davy.ai
Para solucionar este problema, debes actualizar el indexPath del elemento que deseas eliminar después de eliminar el elemento del array de origen de datos. Puedes hacer esto creando un nuevo objeto IndexPath y restando 1 al valor de la fila, o utilizando el inicializador
IndexPath(item:section:)
con el valor de fila actualizado.Aquí tienes un ejemplo utilizando el primer enfoque:
Esto eliminará correctamente la celda en el IndexPath dado, incluso si es la primera celda en la vista de colección. Ten en cuenta que solo debes utilizar
reloadData()
como último recurso, ya que puede causar problemas de rendimiento y puede interrumpir cualquier animación u otras actualizaciones que ocurran en la vista de colección.