ios - [tableView reloadData]; no funciona hasta que me desplazo de la tableView
uitableview (5)
Tengo una aplicación simple que descarga los resultados de búsqueda en XML cuando el usuario escribe en una UISearchBar
. La descarga y el análisis se enlazan y, una vez hecho, NSNotification
una NSNotification
para indicar al ViewController con la vista de tabla a [tableView reloadData];
Aquí está el código que recibe la notificación activada una vez que los resultados están en:
- (void)receivedResults:(id)notification {
results = [notification object];
DLog(@"Received %i results",[results count]);
[[self tableView] reloadData];
}
Obtengo la salida del registro "Recibí 4 resultados", pero la vista de tabla no vuelve a cargar los datos hasta que lo desplazo / arrastro unos píxeles. Estoy usando el estilo de celda UITableViewCellStyleSubtitle
y no estoy cambiando la altura ni ding nada sofisticado con la vista de tabla.
¿Qué estoy haciendo mal?
Llamada
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
en lugar de
[self.tableview reloadData]
Mi problema fue que estaba publicando una NSNotification desde un hilo de fondo. Para evitar esto, simplemente envuelva su método de notificación en un método dispatch_async como este:
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"FinishedDownloading" object:result];
});
Cuando se reciba esta notificación, se tableView.reloadData
a tableView.reloadData
en el hilo principal.
Pude conseguir lo mismo para trabajar. Pero el problema era que los datos de recarga debían ser llamados en el hilo principal.
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
Creo que esto es más práctico que la opción performSelectorOnMainThread
Tengo el mismo problema y he intentado todas las soluciones que puedo encontrar en google. Pero todos ellos no funcionan.
Finalmente encontré que agregué observador antes de viewDidLoad, y luego [self.tableView reloadData] no está funcionando.
Primero, llamo a setObserverForUserInfoDatabase en el viewDidLoad de mi controlador de vista de navegación raíz. Porque creo que se llamaba antes. La función es así:
- (void)setObserverForUserInfoDatabase:(NSString *)name {
[[NSNotificationCenter defaultCenter] addObserverForName:name
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
[self loadUserInfo];
[self.tableView reloadData];
NSLog(@"User Panel Notification /n %@", self);
}];}
Luego muevo el código a viewDidLoad del viewController mismo.
- (void)viewDidLoad {
NSLog(@"View Did Load");
[super viewDidLoad];
[self setObserverForUserInfoDatabase:UserInfoDataBaseAvailabilityNotification];
}
Y entonces todo funciona bien.
Todavía no sé la razón. Si alguien sabe, por favor dígamelo.
vuelva a cargar su tableView
en la viewWillLayoutSubviews
tableView
viewWillLayoutSubviews