2009-04-30 11 views
22

Ho un'applicazione con UITableView. Questo UITableView è popolato da un NSMutableArray trattenuto (come proprietà) nell'appDelegate. Puoi pensare a questo come una finestra di posta elettronica. Elenca i messaggi in una sottoclasse UITableViewCell. Quando viene visualizzato un nuovo messaggio, ho eseguito tutto il codice che scarica il messaggio, aggiunge i dati all'app NSegutableArray dell'appDelegate che contiene tutti i messaggi. Questo codice funziona correttamente.Cosa c'è in [UitableView reloadData]?

Ora, una volta che il nuovo messaggio è stato scaricato e aggiunto all'array, sto cercando di aggiornare il mio UITableView usando il seguente codice, tuttavia - le funzioni delegate di UITableView non vengono chiamate.

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

Please Help !!

CODICE AppDelegate:

[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 
} 
+2

Amico Sento il tuo dolore, lo stesso problema qui. –

risposta

29

Come un controllo di integrità, hai verificato che theTable non è pari a zero, a quel punto?

+0

theTable non è nullo, ma ora che lo menzioni, mostra come indirizzo 0x0. IBOutlet theTable è collegata al controllo in IB, e la tabella rimane visibile attraverso questo intero processo .... – Dutchie432

+7

0x0 è effettivamente nullo-- la vista tabella esiste ovviamente, ma il puntatore ad esso non è stato impostato correttamente. Controlla il tuo pennino. –

+0

Questo è sicuramente il problema allora. Per qualche ragione (impossibile da dire senza vedere tutto il codice) la variabile'Table 'è nulla, quindi il messaggio reloadData non sta andando da nessuna parte. – smorgan

0

Hai provato a impostare un punto di interruzione nel metodo di aggiornamento solo per essere sicuro che la matrice dei messaggi abbia il contenuto corretto prima di chiamare reloadData?

+0

Sì. Quel metodo è stato rivisto molte volte. Posso vedere il mio conteggio di array aumentare e persino vedere il mio nuovo oggetto (messaggio) nel debugger con tutti i valori appropriati. – Dutchie432

12

Si potrebbe provare a mettere un ritardo sulla chiamata reloadData - Ho avuto un problema simile quando stavo cercando di ottenere il mio tableview per aggiornare quando riordinare le celle, tranne che l'app si è bloccata se ho chiamato reloadData durante questo.

Quindi, qualcosa di simile potrebbe essere la pena di provare: metodo di

Refresh:

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

e quindi chiamare con (ad esempio) un 0,5 secondi di ritardo:

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

spero che funziona ...

+0

+1 per lavorare come il fascino –

+0

+1 questo ha funzionato anche per me. Holla! –

+0

Anche questo era il mio problema. Sto ricaricando i dati da un selettore di notifica NSNotificationCenter. – NathanAldenSr

6

Se si chiama reloadData da un metodo inviato, assicurarsi di eseguirlo o n la 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 in forma di 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]; 
     }); 
} 
+1

Bingo! Stavo aggiornando su un thread in background, che non fa nulla. Grazie. – nont

Problemi correlati