2011-11-17 10 views
21

Tengo un problema complicado en cuanto a la actualización de mi TableView, i obtener resultados diferentes usando diferentes métodos de su actualización, me explico:TableView reloadData vs beginUpdates y endUpdates

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

Situación 2: I utilizar:

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

Dónde tbl es mi TableView, y indexPaths es una matriz que contiene todos los indexPaths presentes en el TableView. Ahora la matriz está bien, contiene todos los IndexPaths correctos (dobles y triples marcados) 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 es realmente X porque creo que resolver Y resolverá X) y eso es solo porque creo que es un poco complicado explicar X (la consecuencia de dijo el problema anterior) de una manera fácil, así que prefiero abstenerme de eso si es posible.

Por lo tanto, a mi pregunta: ¿Hay alguna diferencia entre las dos formas de actualizar el TableView (aparte del bit de animación por supuesto) o debería sospechar que el problema está en otro lugar?

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

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

btn.tag = indexPath.row; 

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

- (void)btnPressed:(id)sender 

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

La confusión parece aleatoria para mí, pero la aleatorización se produce de forma diferente según el botón de las celdas que pulse primero. Espero que esto aclare mi problema.

+1

"obtengo resultados diferentes", "esto no funciona como se esperaba". ¿En qué manera? – TigerCoding

+0

Bueno, cada celda recibe un botón al momento de la creación, con una etiqueta, donde 'la etiqueta del botón = la fila de la ruta del índice'. En la situación 1, el botón obtiene la etiqueta correcta, en la situación 2: no. –

Respuesta

19

De los UITableView documentación

beginUpdates
comenzar una serie de llamadas a métodos que insertar, eliminar, o selectas filas y secciones del receptor.

Eso significa que no debe usar esto a menos que esté insertando, borrando o seleccionando. Usted no está haciendo ninguno de estos.

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

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

+1

Ah, sí, el bit 'reloadData' era un error tipográfico en mi publicación, mi mal. –

+0

De acuerdo, entonces eso concluye la diferencia entre reloadData y beginUpdates/endUpdates, pero realmente no puedo ver cómo esta diferencia debería afectar mi resultado de la manera en que lo hace. Me doy cuenta de que he sido un poco vago al describir las consecuencias, actualizaré mi pregunta original en un par de minutos. –

+0

Trate de soltar 'beginUpdates' y' endUpdates'. No pertenecen a 'updateRowsAtIndexPaths'. – Mundi

3

La primera diferencia entre reloadData y reloadRowsAtIndexPaths es que hay 2 UITableViewCell objetos asignados simulteaneosuly para el mismo indexPath al hacer reloadRowsAtIndexPaths (porque el tableview 'mezcla' en el la nueva célula). 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 un identificador de celda particular, la vista de tabla no le devuelve esta celda en dequeueReusableCellWithIdentifier al llamar al reloadRowsAtIndexPaths, sino que devuelve nada . En contradicción, reloadData reutiliza las celdas que ya asignó.

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

Sin embargo, necesitaría publicar un código más para darnos una idea de lo que está haciendo allí. En principio, los indexPaths de las nuevas celdas son idénticos a los antiguos también con reloadRowsAtIndexPaths, siempre que no elimine o inserte filas.

+0

Gracias por su respuesta Leo. Han pasado unos años y no recuerdo qué pasó con este proyecto, sin embargo, dudo que lo haya resuelto alguna vez, espero que esta Q y las respuestas dadas por usted y @Mundi ayuden a alguien más con problemas similares. –

0

Llame este método si desea que las operaciones subsiguientes de inserción, eliminación y selección (por ejemplo, cellForRowAtIndexPath: y indexPathsForVisibleRows) se activen de forma simultánea.

Creo que esto es lo que quiere. beginUpdates & endUpdates puede cambiar la vista UItable con animación.

Cuestiones relacionadas