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.