2009-04-30 14 views
22

Tengo una aplicación que tiene una UITableView. Este UITableView está poblado por un NSMutableArray que se mantiene (como una propiedad) en la aplicaciónDelegate. Puedes pensar en esto como una ventana de correo electrónico. Enumera los mensajes en una UITableViewCell subclasificada. Cuando aparece un nuevo mensaje, tengo todo el código hecho que descarga el mensaje, agrega los datos al NSMutableArray de appDelegate que contiene todos los mensajes. Este código está funcionando bien.¿Qué pasa con [UITableView reloadData]?

Ahora, una vez que se descarga el nuevo mensaje y se agrega a la matriz, estoy tratando de actualizar mi UITableView usando el siguiente código, sin embargo, las funciones de delegado de UITableView no se llaman.

Lo curioso es cuando desplazo mi UITableView hacia arriba y hacia abajo, finalmente se llaman los métodos de delegado y mis encabezados de sección SI cambian (muestran el recuento de mensajes para esa sección). ¿No se actualizan en tiempo real y no esperan a que mi desplazamiento desencadene la actualización? ¡Además, la nueva celda nunca se agrega en la sección!

Por favor ayuda !!

AppDelegate CÓDIGO:

[self refreshMessagesDisplay]; //This is a call placed in the msg download method 

-(void)refreshMessagesDisplay{ 
    [self performSelectorOnMainThread:@selector(performMessageDisplay) withObject:nil waitUntilDone:NO]; 
} 

-(void)performMessageDisplay{ 
    [myMessagesView refresh]; 
} 

Código UITableViewController:

-(void) refresh{ 
    iPhone_PNPAppDelegate *mainDelegate = (iPhone_PNPAppDelegate *)[[UIApplication sharedApplication] delegate]; 

    //self.messages is copied from appDelegate to get (old and) new messages. 
    self.messages=mainDelegate.messages; 

    //Some array manipulation takes place here. 

    [theTable reloadData]; 
    [theTable setNeedsLayout]; //added out of desperation 
    [theTable setNeedsDisplay]; //added out of desperation 
} 
+2

Amigo Siento su dolor, el mismo problema aquí. –

Respuesta

29

Como una comprobación de validez, ¿ha verificado que thetable no es nula en ese momento?

+0

theTable no es nada, pero ahora que lo mencionas, se muestra como dirección 0x0. IBOutlet theTable está vinculado al control en IB, y la tabla permanece visible a lo largo de todo este proceso ... – Dutchie432

+7

0x0 en realidad es nil-- la vista de tabla existe, por supuesto, pero su puntero no se ha configurado correctamente. Revisa tu plumilla. –

+0

Ese es definitivamente el problema entonces. Por alguna razón (imposible de decir sin ver todo el código) su variable 'theTable' es nula, por lo que el mensaje reloadData no va a ninguna parte. – smorgan

0

¿Ha intentado establecer un punto de interrupción en su método de actualización solo para asegurarse de que su matriz de mensajes tenga el contenido correcto antes de llamar a reloadData?

+0

Sí. Ese método ha sido revisado muchas veces. Veo que mi cuenta de Array aumenta, e incluso puedo ver mi nuevo objeto (mensaje) en el depurador con todos los valores apropiados. – Dutchie432

12

Podría intentar poner un retraso en la llamada a reloadData. Tuve un problema similar cuando estaba tratando de actualizar mi tabla para reordenar las celdas, excepto que la aplicación se bloqueó si llamé a reloadData durante la misma.

Así que algo como esto podría valer la pena probar: Método

Actualizar:

- (void)refreshDisplay:(UITableView *)tableView { 
    [tableView reloadData]; 
} 

y luego llamarlo con (por ejemplo) un retardo de 0.5 segundos:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5]; 

espero que funciona ...

+0

+1 para trabajar como amuleto –

+0

+1 esto también funcionó para mí. Holla! –

+0

Este fue mi problema, también. Estoy recargando datos desde un selector de notificaciones de NSNotificationCenter. – NathanAldenSr

6

Si llama a reloadData desde un método enviado, asegúrese de ejecutarlo o n la cola principal.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) { 

    // hard work/updating here 

    // when finished ... 
    dispatch_async(dispatch_get_main_queue(), ^(void) { 
     [self.myTableView reloadData]; 
    }); 
}); 

..same en forma de método:

-(void)updateDataInBackground { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) { 

     // hard work/updating here 

     // when finished ... 
     [self reloadTable]; 
    }); 
} 

-(void)reloadTable { 
     dispatch_async(dispatch_get_main_queue(), ^(void) { 
      [myTableView reloadData]; 
     }); 
} 
+1

¡Bingo! Estaba actualizando en un hilo de fondo, que no hace nada. Gracias. – nont

Cuestiones relacionadas