uitableviewcell source number example data iphone uitableview xamarin.ios

iphone - source - Redibuje UITableView después de actualizar los datos asíncronos



uitableviewcell swift 3 (5)

Tengo una vista de UITable que cargo con datos asíncronos, por lo que la vista de tabla puede aparecer sin datos.
He agotado el método ReloadData pero la vista de tabla permanece vacía hasta que desplazo la vista de tabla, de repente aparecen los datos.
Lo mismo sucede cuando carga una vista de tabla como una vista detallada y al cambiar entre elementos, los datos de los elementos anteriores aparecen primero y, tan pronto como me desplazo en la vista de tabla, se muestran los datos correctos.
Supongo que el método ReloadData funciona bien, pero necesito volver a dibujar la vista de tabla de alguna manera, ¿alguna sugerencia sobre cómo resolver esto?

/Palanqueta


Después de copiar algo ingenuamente en la solución de yonel y de llamarlo bien, me di cuenta de que al llamar a performSelectorOnMainThread:withObject:waitUntilDone: solucionaba el síntoma, pero no el problema. El mayor problema es que estás realizando actualizaciones de la interfaz de usuario mientras aún estás en el contexto del subproceso asíncrono o de fondo.

Así es como se veía mi código:

dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL); dispatch_async(queue, ^{ // Make API call // Retrieve data, parse JSON, update local properties // Make a call to reload table data });

Cuando debería verse así:

dispatch_queue_t queue = dispatch_queue_create("com.kyleclegg.myqueue", NULL); dispatch_async(queue, ^{ // Make API call // Retrieve data, parse JSON, update local properties dispatch_async(dispatch_get_main_queue(), ^{ // Now make the call to reload data and make any other UI updates [self.tableView reloadData] }); });

Si lo único que debe hacer es llamar a [self.tableView reloadData] probablemente esté bien usar performSelectorOnMainThread:withObject:waitUntilDone: ya que cumple el mismo objetivo, pero también debe reconocer lo que está sucediendo en el panorama general. Además, si está haciendo más trabajo de UI que solo recargando la tabla, todo ese código debería ir a la cola principal también.

Referencia: un ejemplo conciso del uso de GCD y la gestión del hilo de fondo frente al principal.


La respuesta de Yonels es perfecta cuando el usuario puede ver su vista en ese momento (por ejemplo: el usuario presiona un botón de recarga que llena su UITableView ).

Sin embargo, si sus datos se cargan de forma asíncrona y su UITableView no está visible durante la actualización (p. Ej., Si agrega datos a su UITableView en otra vista y la UITableView se muestra más adelante por el ingreso del usuario), simplemente anule el método viewWillAppear del viewWillAppear .

- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.tableView reloadData]; }

El efecto positivo es que su UITableView solo UITableView sus datos una vez cuando el usuario realmente quiere verlos, no cuando se agregan nuevos elementos.


Supongo que no fue recargado.

Cuando desplaza las celdas hacia fuera de la pantalla, entonces ...

tableView: cellForRowAtIndexPath:

…sera llamado. Así será recargado.

Supongo que la variable UITableView no está validada.

Si usa UITableView como vista principal, puede intentar esto.

[self.view reloadData];

o

[self.tableView reloadData];


Tuve un problema similar hoy (Storyboard en iOS 7.0). Estaba usando la vista de tabla dentro de un UIViewController. Cuando se cargó la vista, todo funcionaba bien; todos los delegados estaban siendo llamados. Cuando se modificó la fuente de datos subyacente (en mi caso, Array); las filas de la tabla visible no se estaban actualizando. Se actualizaron; Sólo cuando estaba desplazando la vista de tabla.

Lo intenté todo; llamando a reloadData en el subproceso principal; llamando a reload en ViewWillAppear; nada funcionó.

El problema que encontré; era que no había hecho la conexión en el guión gráfico; para la vista de tabla con el Outlet de referencia. Sin embargo, la fuente de datos y el delegado se configuraron. No pensé que podría ser el problema; Como todo funcionaba bien a la primera.

Espero que ayude a alguien. Tuve un tiempo terrible para averiguarlo.


Usted dijo que estaba llenando el contenido de forma asíncrona, pero ¿invocó reloadData en el contexto del hilo principal? (y no a través del hilo que llena el contenido)

C objetivo

[yourUITableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

Rápido

dispatch_async(dispatch_get_main_queue(), { self.tableView.reloadData() })

Monotouco

InvokeOnMainThread(() => this.TableView.ReloadData());