2011-05-05 21 views
5

Tengo una aplicación simple donde tengo una vista de tabla & dependiendo de la devolución de llamada con la matriz Recargo los datos de la tabla usando el método reloadData. Inicialmente durante los primeros 5 a 10 tiempos de carga, esta vista de tabla funciona sin ningún problema. Después de jugar con la aplicación, a veces noté que la vista de tabla está en blanco debido a la razón por la cual el framework no llama a cellForRowAtIndexPath. He verificado que datasource & delegate se ajusta adecuadamente & numberOfRowsInSection devuelve un número positivo válido. Una vez que veo la vista de tabla en blanco, puedo ver esta vista en blanco repetidamente hasta que salgo de la aplicación. No recibo ningún error o advertencia en la consola. Traté de ajustar la matriz, pero fue en vano.cellForRowAtIndexPath no se llama a veces después de llamar a numberOfRowsInSection al llamar a reloadData

Aquí está el código:

- (void)notifyArrayLoaded:(NSArray *)arr { 
    NSUInteger capacity = [arr count]; 
    _tbDataArray = [[NSMutableArray alloc] initWithCapacity:capacity]; 

    // _tbDataArray is filled with the data from arr 

    // Reload the table data 
    [_tableView reloadData]; 
} 

será muy apreciada Cualquier pista.

Gracias de antemano. Sumit

Hola DeanWombourne, no tengo el método viewDidUnLoad pero tengo el método viewWillDisAppear que lo publico aquí.

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationPortrait; 
    [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO]; 
    [self.navigationController setNavigationBarHidden:NO animated:NO]; 

    UIWindow *window = [[UIApplication sharedApplication] keyWindow]; 
    UIView *view = [window.subviews objectAtIndex:0]; 

    view.transform = CGAffineTransformIdentity; 
    view.transform = CGAffineTransformMakeRotation(0); 
    view.bounds = CGRectMake(0.0, 0.0, 320, 480); 
} 

Este es el registros de tableView como conectado.

[numberOfSectionsInTableView:] [Line 223] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}> 
[tableView:numberOfRowsInSection:] [Line 229] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}> 
<UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}> 
[numberOfSectionsInTableView:] [Line 223] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}> 
[tableView:numberOfRowsInSection:] [Line 229] <UITableView: 0xa5fc00; frame = (0 0; 320 0); clipsToBounds = YES; layer = <CALayer: 0x4830b0>; contentOffset: {0, 0}> 
+0

¿Su notificación siempre se ejecuta en el hilo principal? – deanWombourne

+0

¿Cómo maneja las advertencias de memoria/viewDidUnload? ¿Puede agregar ese método a su pregunta? – deanWombourne

+0

¿Puede agregar la línea 'NSLog (@"% @ ", _tableView);' justo antes de volver a cargar los datos, existe la posibilidad de que su tableView sea nulo? – deanWombourne

Respuesta

5

Si reloadData causas numberOfRowsInSection a ser llamados, pero no cellForRowAtIndexPath, compruebe que el UITableView ejemplo que llamó reloadData en UITableView es el mismo que se ha mostrado en la vista, por ejemplo,

NSLog(@"Calling reloadData on %@", self.tableView); 
[self.tableView reloadData]; 

Creo que usted encuentra que tiene dos diferentes UITableViews. El rompecabezas entonces está trabajando por qué ...

0

ir al archivo de encabezado de la viewcontroller y añadir (IBOutlet) al miembro tableView. a continuación, conecte InterfaceB throught

10

Asegúrate de que llamar reloadData en el hilo principal. Si va a cargar sus datos de forma asíncrona mediante performSelectorInBackground y llamando reloadData en ese método, que debe, en vez de hacer algo como:

[tableViewController reloadData] 

Lo que usted debe hacer es

[tableViewController performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO] 
+0

Gracias esto se trabajó para mí –

0

Esto puede ser demasiado tarde , pero de todos modos esto podría ayudar. He enfrentado el mismo problema.

En resumen puede haber respuesta "de Florian Segginger" tenía razón.

Mi situación era 1.calling servicio web de forma asíncrona para obtener datos (tire para refrescar) 2. Mientras esto fue procesado, se trasladó a otro controlador de vista (empujado) 3.poped atrás y mi aplicación se estrelló.

Así que entre los pasos 2 y 3, he notado que el número de filas y el número de secciones para la mesa, pero en realidad se llama celda para la fila no lo hizo.Se reanudó cuando desaparecí cuando el recuento de la tabla cambiaba debido a otra lógica. Si se procesaba esta prueba, si la vista era visible en la conexión, terminaba de cargarse porque estaba recargando la tabla a la vista. Esto podría deberse a cell for row es en realidad una acción de rendering (UI) que debe ejecutarse en el hilo principal.

0

Tuve los mismos síntomas también. En mi caso, la primera vez que cargué los datos (de los datos centrales) en viewDidLoad, NSSortDescriptor se utilizó para ordenar los datos.

Con solo hacer clic en un botón, los datos del núcleo se recuperaron de nuevo (esta vez con cambios) y los datos de tableView se volvieron a cargar. Inicialmente, me dio una vista de tabla en blanco después de hacer clic en el botón porque olvidé ordenar los datos la segunda vez que lo busqué.

Puntos de aprendizaje: ¡Recuerde llamar a todos los métodos que modifican la celda como NSSortDescriptor si los ha usado al principio!

Cuestiones relacionadas