Pregunta

Tengo una aplicación que tiene un UITableView. Este UITableView está poblado por un NSMutableArray que se mantiene (como una propiedad) en el appDelegate. Puedes pensar en esto como una ventana de correo electrónico. Enumera los mensajes en un UITableViewCell subclasificado. Cuando aparece un nuevo mensaje, tengo todo el código que descarga el mensaje y agrega los datos a la aplicación NSMutableArray del appDelegate que contiene todos los mensajes. Este código funciona bien.

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

Lo extraño es que cuando muevo mi UITableView hacia arriba y hacia abajo, finalmente se llama a los métodos de delegado y cambian los encabezados de mis secciones (muestran el recuento de mensajes para esa sección). ¿No deberían actualizarse en tiempo real y no esperar a que mi desplazamiento active la actualización? Además, la nueva celda nunca se agrega en la sección!

¡Por favor ayuda!

APLICAR 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];
}

UITableViewController Code:

-(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
}
¿Fue útil?

Solución

Como comprobación de validez, ¿has verificado que la tabla no es nula en ese momento?

Otros consejos

Así que algo como esto podría valer la pena intentarlo:

Método de actualización:

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

y luego llámelo con (digamos) una demora de 0.5 segundos:

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

Espero que funcione ...

Si llama a reloadData desde un método despachado, asegúrese de ejecutarlo en 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];
        }); 
}

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top