Domanda

Ho un'applicazione che ha un UITableView. Questo UITableView è popolato da un NSMutableArray tenuto (come proprietà) in appDelegate. Puoi pensarlo come una finestra di posta elettronica. Elenca i messaggi in un UITableViewCell sottoclassato. Quando appare un nuovo messaggio, ho fatto tutto il codice che scarica il messaggio, aggiunge i dati al NSMutableArray dell'appDelegate che contiene tutti i messaggi. Questo codice funziona correttamente.

Ora, una volta scaricato e aggiunto l'array al nuovo messaggio, sto provando ad aggiornare il mio UITableView usando il seguente codice, tuttavia le funzioni delegate di UITableView non vengono chiamate.

La cosa strana è quando faccio scorrere il mio UITableView su e giù, i metodi delegati finalmente vengono chiamati e le mie intestazioni di sezione cambiano (mostrano il conteggio dei messaggi per quella sezione). Non si aggiornano in tempo reale e non aspettano che il mio scorrimento avvii l'aggiornamento? Inoltre, la nuova cella non viene mai aggiunta nella sezione !!

Per favore aiutate !!

CODICE APPDELEGATO:

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

Codice 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
}
È stato utile?

Soluzione

Come controllo di integrità, hai verificato che la tabella non è nulla a quel punto?

Altri suggerimenti

Potresti provare a ritardare la chiamata reloadData: ho avuto un problema simile quando stavo cercando di aggiornare la mia vista tabella durante il riordino delle celle, tranne per il fatto che l'app si arrestava in modo anomalo se avessi chiamato reloadData durante esso.

Quindi potrebbe valere la pena provare qualcosa del genere:

Metodo di aggiornamento:

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

e quindi chiamalo con (diciamo) un ritardo di 0,5 secondi:

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

Spero che funzioni ...

Se si chiama reloadData da un metodo inviato, assicurarsi di eseguirlo sulla coda principale.

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 nella forma del metodo:

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

Hai provato a impostare un breakpoint nel tuo metodo di aggiornamento solo per assicurarti che l'array dei messaggi abbia il contenuto corretto prima di chiamare reloadData?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top