2011-02-11 8 views
21

Tengo una aplicación simple que descarga los resultados de búsqueda en XML cuando el usuario escribe en un UISearchBar. La descarga + análisis se enrosca y una vez hecho dispara un NSNotification para contar la ViewController con la vista de tabla a [tableView reloadData];[tableView reloadData]; no funciona hasta que me desplazo por la tabla View

Aquí está el código que recibe la notificación disparada vez que los resultados están en:

- (void)receivedResults:(id)notification { 
    results = [notification object]; 
    DLog(@"Received %i results",[results count]); 
    [[self tableView] reloadData]; 
} 

consigo la salida de registro "Recibió 4 resultados", pero la vista de tabla no vuelve a cargar los datos hasta que lo desplazo/arrastre un par de píxeles. Estoy utilizando el estilo de celda UITableViewCellStyleSubtitle incorporado y no estoy cambiando la altura o el diseño nada sofisticado con la vista de tabla.

¿Qué estoy haciendo mal?

+0

resultados es, por supuesto, una variable de instancia y la fuente de la vista de tabla, de lo contrario el código anterior no funcionaría incluso cuando se tira de la vista de tabla alrededor después de la búsqueda. –

+0

tu seguro [self tableView] no devuelve nada? Podría ser la razón por la cual la recarga no responde, pero la celdaForRowAtIndexPath sí lo hace.Ese método es invocado por el delegado. –

Respuesta

65

yo era capaz de conseguir lo mismo para trabajar. Pero el problema era que los datos de recarga debían invocarse 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

+0

No sé si es mucho más práctico, sin embargo, Apple recomienda GCD a favor del patrón performSelector .... –

+0

@MaciejSwic Esta debería ser la solución correcta para esta pregunta específica. El problema es que el OP intenta cambiar la UI en un hilo de fondo, lo más probable es que olvidó salir de él. No debe llamar a performSelectorOnMainThread solo como una solución alternativa. –

+0

Esto no lo solucionó para mí. Mi problema es muy similar, pero con la variación de que las celdas solo muestran su contenido cuando se han desplazado completamente fuera de la vista y de nuevo a la vista. Estoy completamente desconcertado por esta hasta ahora –

34

llamada

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

en lugar de

[self.tableview reloadData] 
+0

Bien, estaba recargando mis datos en el controlador de eventos para una NSNotificación. – NMunro

4

Mi problema era que yo estaba registrando una NSNotification de un subproceso en segundo plano. Para evitar esto, simplemente envolver su postNotificationMethod en un método dispatch_async así:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"FinishedDownloading" object:result]; 
}); 

¿Cuándo se recibe esta notificación, el tableView.reloadData serán llamados en el hilo principal.

0

Tengo el mismo problema, y ​​he intentado con todas las soluciones que puedo encontrar en google. Pero todos ellos no funcionan.

Por fin encontré que agrego un observador antes de viewDidLoad, y luego [self.tableView reloadData] no está funcionando.

Primero llamo a setObserverForUserInfoDatabase en viewDidLoad de mi controlador de vista de navegación raíz. Porque creo que se llamó antes. La función es la siguiente:

- (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); 
                }];} 

Entonces mover el código en viewDidLoad del propio viewController.

- (void)viewDidLoad { 
    NSLog(@"View Did Load"); 
    [super viewDidLoad]; 

    [self setObserverForUserInfoDatabase:UserInfoDataBaseAvailabilityNotification]; 
} 

Y todo funciona bien.

No sé el motivo todavía. Si alguien sabe, por favor dígamelo.

+0

setObserverForUserInfoDatabase hacer y dónde estaba antes –

+0

la función de observador sólo tiene que añadir lo pongo en el viewDidLoad del RootViewController y es no funciona – wgr

0

recarga sus tableView en viewWillLayoutSubviews

Cuestiones relacionadas