2012-09-02 8 views
5

soy eliminar algunas filas en UITableView así:UITableView borrar y recargar las células

[tableView deleteRowsAtIndexPaths:toDelete withRowAnimation:UITableViewRowAnimationAutomatic]; 

Esto añade una bonita animación a la operación de eliminación.

Sin embargo, después de eliminar necesito actualizar todas las filas visibles actualmente. Llamando a

[tableView reloadData]; 

justo después de que la primera llamada funciona, pero el efecto de animación agradable se ha ido. ¿Cuál es una mejor manera de hacer esto? es decir, para animar la operación de eliminación y actualizar todas las filas visibles actualmente? Gracias!

La razón por la que tengo que hacer esto es porque cada celda contiene una 'casilla de verificación'. Mi controlador de vista es delegado de casilla de verificación y cada casilla de verificación tiene un NSIndexPath asociado. Cuando se activa la casilla de verificación, se llama a delegar diciéndole oye, cambiamos para x ruta de índice. Ahora, si se eliminan algunas filas, las rutas de índice deben actualizarse. Es por eso que necesito volver a cargar todo para que cada casilla sepa a dónde pertenece.

+0

¿Por qué necesita forzar una recarga después de eliminar? (¿No se puede eliminar la fila de la fuente de datos antes de llamar a deleteRowsAtIndexPaths, o está pasando algo más significativo?) –

+0

No recuerdo si funciona, pero ¿ha intentado hacer la eliminación a nivel de modelo, y luego simplemente envolviendo 'reloadData' en un bloque' [UIView animateWithDuration ...] ' –

+0

@middaparka actualizaré mi pregunta explicando exactamente por qué tengo que hacer esto. – 0xSina

Respuesta

-1

Nota:Como se señaló en los comentarios, es probable que esta respuesta no funcionará. Si no fuera aceptado, lo eliminaría.

No estoy 100% seguro de que esta sea la mejor forma de hacerlo , pero hay algo gratamente limpio al respecto. Podemos concluir reloadData en un bloque de animación UIView regular después de modificar el modelo subyacente: bloque de animación

// if self.people is a mutable array 
[self.people removeObjectAtIndex:13]; 

[UIView animateWithDuration:0.5 animations:^{ 
    [self.tableView reloadData]; 
}]; 
+0

Como señaló Vanson Wing Leung, esto no funciona independientemente de la duración que se pase ... – simonthumper

+0

La razón por la que esto no funciona, supongo que se debe a que reloadData no es una propiedad animable de una UIView, en su lugar, usted desea cámbielo a esto, que debería funcionar bien: '[self.tableView performSelector: @selector (reloadData) withObject: nil afterDelay: 0.14];' – simonthumper

1

de ctrahey no funciona para mí no importa lo que la duración se pasa. Investigué el mecanismo de eliminación de UITableView, inserte & recarga. Estoy manteniendo mi proyecto en Github contrarrestando este problema.

https://github.com/VansonLeung/VanTableController

Incluye una prueba de unidad de trabajo en ella. Normalmente, con el fin de animar la animación de células de UITableView, tenemos que hacer algo como esto:

[tableView_ beginUpdates]; 
[tableView_ deleteRowsAtIndexPaths: indexPathDelete withRowAnimation:UITableViewRowAnimationAutomatic]; 
[tableView_ insertRowsAtIndexPaths: indexPathInsert withRowAnimation:UITableViewRowAnimationAutomatic]; 
[tableView_ reloadRowsAtIndexPaths: indexPathReload withRowAnimation:UITableViewRowAnimationAutomatic]; 
[tableView_ endUpdates]; 

Tenemos que determinar las filas borrar, insertar filas & matrices indexPath recarga filas y es un trabajo muy desagradable! Mi trabajo de proyecto es básicamente un contenedor para generar estos indexPaths.

0

Tuve algunos problemas relacionados con él. Usando un índice fijo probablemente enfrentará muchos dolores de cabeza. He resuelto esto agregando a UITableViewCell una referencia a un elemento de mi fuente de datos, no un NSIndexPath. Por lo tanto, no es necesario utilizar indexPath guardado en su celda.

Además, hay información en el sitio web de Apple que dice que no debemos usar el método reloadData dentro de los métodos de inserción o eliminación.

Apple docs

todo este método para recargar todos los datos que se utiliza para construir la tabla, incluyendo las células, los encabezados de sección y los pies de página, arrays de índice, y así sucesivamente. Para mayor eficiencia, la vista de tabla vuelve a mostrar solo aquellas filas que son visibles.Ajusta las compensaciones si la tabla se contrae como resultado de la recarga. El delegado o fuente de datos de la vista de tabla llama a este método cuando quiere que la vista de tabla recargue completamente sus datos. No debe invocarse en los métodos que insertan o eliminan filas, especialmente dentro de un bloque de animación implementado con llamadas a beginUpdates y endUpdates

Cuestiones relacionadas