ios objective-c reloaddata

ios - TableView reloadData vs. beginUpdates y endUpdates



objective-c (3)

De la documentación de la UITableView

InicioActualizaciones
Comience una serie de llamadas a métodos que insertan, eliminan o seleccionan filas y secciones del receptor.

Eso significa que no debe usar esto a menos que esté insertando, eliminando o seleccionando. No estás haciendo nada de esto.

Además, debe finalizar las beginUpdates con las endUpdates finales, no con endUpdates reloadData . Documentación:

Este grupo de métodos debe concluir con una invocación de endUpdates.

Tengo un problema difícil relacionado con la actualización de mi TableView, obtengo diferentes resultados usando diferentes métodos para actualizarlo, déjame explicarte:

Situación 1: uso [tbl reloadData]; donde tbl es mi TableView, para actualizar el TableView - funciona según lo previsto.

Situación 2: uso:

[tbl beginUpdates]; [tbl reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight]; [tbl endUpdates];

Donde tbl es mi TableView, e indexPaths es una matriz que contiene todas las indexPaths presentes en TableView. Ahora la matriz está bien, contiene todas las rutas de índice correctas (doble y triple), pero por alguna razón, esto no funciona como se esperaba.

Ahora me doy cuenta de que este es un problema XY (donde pido Y pero mi problema realmente es X porque creo que resolver Y resolverá X) y eso es solo porque creo que es un poco complicado explicar X (la consecuencia de dicho problema anterior) de una manera fácil, así que prefiero abstenerme de eso si es posible.

Entonces, en mi pregunta: ¿hay alguna diferencia entre las dos formas de actualizar TableView (aparte del bit de animación, por supuesto) o debo sospechar que el problema está en otro lado?

EDIT: Está bien, voy a tratar de explicar cuáles son los síntomas:

En el método cellForRowAtIndexPath agrego un botón a cada celda con una etiqueta asignada que es igual a la fila indexPath de la celda, como por ejemplo:

btn.tag = indexPath.row;

La razón por la que hago esto es para poder identificar cada botón, ya que todos ellos llaman a la misma función:

- (void)btnPressed:(id)sender

Cuando luego actualizo las celdas, porque algunos valores en las celdas han cambiado, la Situación 1 hace que todo funcione bien, pero la Situación 2 mezcla las etiquetas para que la próxima vez que se presione uno de los botones, ya no tengan las etiquetas correctas.

La mezcla me parece aleatoria, pero la aleatorización ocurre de manera diferente según el botón de las celdas que presiono primero. Espero que esto aclare mi problema.


La primera diferencia entre reloadData y reloadRowsAtIndexPaths es que hay 2 objetos UITableViewCell asignados simultáneamente para la misma indexPath cuando se realiza reloadRowsAtIndexPaths (porque la vista de tabla se "combina" en la nueva celda). Esto a veces no está previsto por el código en cellForRowAtIndexPath . La sorpresa proviene del hecho de que incluso si una celda ya estaba asignada para una identificación de celda particular, la vista de tabla no le devuelve esta celda en dequeueReusableCellWithIdentifier cuando llama reloadRowsAtIndexPaths , en cambio, devuelve nil . En contradicción, reloadData reutiliza las celdas que ya ha asignado.

La segunda diferencia es que endUpdates después de reloadRowsAtIndexPaths llama directamente a cellForRowAtIndexPath (si establece un punto de interrupción allí, endUpdates es visible en el seguimiento de la pila) mientras que reloadData programa las llamadas a cellForRowAtIndexPath en un momento posterior (no visible en el seguimiento de la pila).

Sin embargo, deberías publicar un poco más de código para darnos una idea de lo que estás haciendo allí. En principio, las indexPaths de las nuevas celdas son idénticas a las antiguas también con reloadRowsAtIndexPaths siempre que no borre o inserte filas.


Llame a este método si desea que las animaciones posteriores, las operaciones de eliminación y selección (por ejemplo, cellForRowAtIndexPath: e indexPathsForVisibleRows) se animen simultáneamente.

Creo que esto es lo que quieres. beginUpdates y endUpdates pueden cambiar la vista de UItable con la animación.