2010-02-16 8 views
19

Entiendo que UITableView llamará al método -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath para obtener cada una de las celdas para la vista de tabla. Supongamos que tengo mi fuente de datos en Internet y tengo que dar cuenta de la latencia. ¿Cuál será la mejor manera de "detener" que se llame este método? ¿Debería bloquearse en una bandera booleana en la aplicación? ¿Debo simplemente llamar al cellForRowAtIndexPath nuevamente desde mi aplicación?¿Cómo detener la descarga de UITableView hasta que se hayan obtenido los datos?

No estoy seguro de cuándo se llama la función, es decir, con qué frecuencia el UITableView se "refresca" a sí mismo. ¡Cualquier explicación será útil! ¡Gracias!

Respuesta

37

Si no tiene datos, o no tiene los datos para celdas adicionales, no se llamará a cellForRowAtIndex:, siempre y cuando no le indique a UTableView que tiene rowCounts o nuevos rowCounts. Ese valor se establece en numberOfRowsInSection:.

En otras palabras, no informe ninguna celda nueva en numberOfRowsInSection:, hasta que tenga esos datos en la mano, y luego cellForRowAtIndexPath: no se llamarán prematuramente.

Cuando obtenga los datos de fila adicionales, llame al reloadData para obtener la UITableView para pedir el número de filas y luego llame al cellForRowAtIndex:.

+0

gracias por esta respuesta. ¿Cómo establecerías numeberOfRowsInSection más tarde? cuando se llama a reloadData, ¿se invocarán automáticamente cellForRowAtIndex o numberOfRowsInSection? – Ying

+0

Sí, cuando llamas a reloadData, muchas de estas llamadas se realizarán automáticamente. – mahboudz

+5

Otra forma de hacerlo es hacer que su propiedad 'UITableViews.dataSource' se establezca en cero hasta que esté listo para cargarla. Luego lo configura y llama a 'reloadData'. Esto funciona muy bien si solo tiene que esperar a que finalice una solicitud para la carga de la tabla inicial. – zekel

1

Lo que debe hacer es llamar a reloadData en su vista de tabla cuando sus datos estén terminados. Eso obligará a la vista de tabla a llamar a sus métodos delegados nuevamente para su visualización. Se llaman a esos métodos cada vez que la vista de tabla necesita volver a mostrarse, por lo que cuando aparece, se produce el desplazamiento o se llama manualmente a reloadData.

5

Si ha establecido UITableView fuente de datos y el delegado de IB entonces será al menos ir para numberOfRowsInSection método cuando se presiona a la vista, sin embargo, si usted está mostrando datos de un NSArray, que va a volver recuento CERO si el array todavía está vacío, por lo que la tabla no buscará otros métodos para llamar.

En la práctica, estoy tirando de datos de servicio web para alimentar a la mesa, así que no soy la creación de la fuente de datos y el delegado de IB lugar una vez que consiga los datos y el estado OK respuesta que había puesto el tableview.datasource = self y tableview.delegate = self y luego llame al método reloadData para actualizar la tabla. Esto garantiza que no se aplicará el método numberOfRowsInSection ya que no es necesario que lo invoque sin tener los datos.

+0

y sí, cuando configura 'tableview.datasource = self' y' tableview.delegate = self' al menos para ese momento, no necesita llamar a 'reloadData'. – Hemang

+0

¿Cómo evitar que la vista de tabla recargue datos al configurar el origen de datos? Quiero que vuelva a cargar manualmente, como hago la animación después de configurar el origen de datos. – Hokage

1

Al invocar [tableView reloadData], el marco automáticamente invoca todos los métodos de fuente de datos para las celdas de vista de tabla que están visibles actualmente (no para todas las celdas de la tabla). Entonces, el mejor enfoque sería invocar reloadData cada vez que obtenga datos de Internet.

Cuestiones relacionadas