es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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()
    }

}
Tags:  , , ,

Answer

  1. Avatar for 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:

    func deleteMoviewhenFilterOFF(index: IndexPath) {
        self.movieViewModels.remove(at: index.row)
        let updatedIndex = IndexPath(row: index.row - 1, section: index.section)
        self.clctnView.performBatchUpdates {
            self.clctnView.deleteItems(at: [updatedIndex])
        } completion: { success in
            print("actualización exitosa")
        }
    }
    

    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.

Comments are closed.