2011-10-18 21 views
33

Tengo muchos datos y muchas filas en mi tableView. cuando cambian los datos Quiero actualizar mis celdas visibles en la pantalla, realmente no quiero usar reloadData porque es una llamada costosa.iOS - Tabla de actualización UITableView correctamente?

¿Es posible de alguna manera actualizar solo las celdas visibles? He intentado llamar: beginUpdate & endUpdate sobre la mesa, pero eso no funciona todo el tiempo?

¿Alguna sugerencia?

+0

¿Seguro reloadData es ¿costoso? Espero que sea bastante barato, siempre y cuando no uses alturas variables. Va a consultar cuántas secciones tiene en la tabla, cuántas filas en cada sección y purgar su caché. Pero las celdas se volverán a cargar bajo demanda, lo que significa que solo las celdas visibles deberían volver a cargarse. –

+0

Si va a actualizar todas las celdas _visible_, entonces reloadData no debe ser ** tan caro. – Nevin

+0

@StevenFisher Sí, en mi caso es muy caro, tengo muchos cálculos, como la altura requerida de las celdas y algunas llamadas a la web. Así que probablemente debería haber dicho que es caro para mi caso. – aryaxt

Respuesta

86

Puede:

[tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows] 
       withRowAnimation:UITableViewRowAnimationNone]; 
+0

muy agradable, gracias. Esta es una solución perfecta especialmente cuando se trata de recargar una sola célula. – aryaxt

+0

¿Qué sucede si el usuario luego se desplaza a una celda que no estaba visible cuando se realizó esa llamada? él verá información desactualizada, supongo? – dancl

+2

Las celdas que no son visibles no se rellenan con datos. Se completan a medida que aparecen en la pantalla a través de las devoluciones de llamadas de origen de datos de la vista de tabla. –

-1

Trate de llamar '' deleteRowsAtIndexPaths, un método de UITableView, justo después de eliminar el modelo del origen de datos. Por ejemplo, si está eliminando una fila en el modo de edición, podría escribir algo como el siguiente código. Tenga en cuenta que la primera línea en la sentencia 'if' quita el objeto del origen de datos, y la segunda línea se limpia la mesa:

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     [[[[[ItemsStore sharedStore] parameterArray] objectAtIndex:indexPath.section] objectForKey:@"data"] removeObjectAtIndex:indexPath.row]; 

     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

    } 
} 
0

Para Swift 3:

tableView.reloadRows(at: tableView.indexPathsForVisibleRows!, with: .none) 
Cuestiones relacionadas