2012-03-22 14 views
5

Qui è la mia funzione di ricaricaiOS UITableView reloadData rinfresca unico tavolo la seconda volta che io chiamo la mia funzione di ricarica

- (void) reloadTable:(id)sender 
{ 
    NSLog(@"Reload Table"); 
    NSLog(@"%@",[appDelegate queryList]); 
    [self.driverTable reloadData]; 
    [self.driverTable setNeedsLayout]; 
    [self.driverTable setNeedsDisplay]; 
} 

Qui è dove lo chiamo io, dopo aver ricevuto i dati dal webservice

if([elementName isEqualToString:@"Response"]) { 
    Response = NO; 
    LookupView *lookupView = [[LookupView alloc] initWithNibName:@"LookupView" bundle:nil]; 
    [lookupView reloadTable:self]; 
} 

Problema ho ora è dopo che faccio una ricerca premendo un pulsante Trova e ricevere i dati. La tabella non si aggiorna con i nuovi dati. Se richiamo di nuovo la stessa funzione premendo nuovamente il pulsante Trova, la tabella si ricarica. Ora so che i dati sono lì perché stampo la matrice prima di chiamare il ricaricamento della tabella.

Qualche idea, perché?

+0

perché hai bisogno di setNeedsLayout e setNeedsDisplay? UITableViews non ha bisogno di essere ridisegnato, lo gestiscono da soli al momento della ricarica. – CodaFi

+0

oh, stavo solo cercando delle soluzioni qui, alcune persone con problemi simili hanno menzionato questo, quindi stavo solo provando –

+0

Elimina il metodo menzionato da @CodaFi. Non appartiene ad essere lì. –

risposta

6

Ho incontrato lo stesso problema. Per la documentazione di Apple, reloadData "non dovrebbe essere chiamato nei metodi che inseriscono o eliminano le righe." Una soluzione alternativa che ho usato è di ritardare la chiamata a reloadData in modo che non sia immediatamente dopo l'aggiornamento della tabella. Prova questo:

[self performSelector:@selector(delayedReloadData) withObject:nil afterDelay:0.5]; 

nel punto appropriato con la seguente implementazione di delayReloadData

-(void)delayedReloadData{ 
    [self.tableView reloadData]; 
} 

Un lato negativo influenzare Ho vedere da questo approccio è che se la riga della tabella è visibile c'è un breve ritardo prima che mostri il suo contenuto.

+0

Questo sembrava aver funzionato per me grazie –

+0

[questo] (http://stackoverflow.com/questions/14018754/why-reloaddata-shouldnt-be-called-on-methods-that -delete-insert-rows) la domanda può essere considerata come un seguito alla risposta di @ bobnoble – abbood

0

Ho scoperto che stai eseguendo l'analisi XML vedendo che elementName nel tuo if loop. Perché è necessario load a NIB file nel codice di analisi. A che cosa serve? Puoi semplicemente chiamare il tuo metodo reloadTable: proprio come questo.

[self reloadTable:self]; 

si popolano il vostro tableView utilizzando alcune serie nel file app delegate. Quindi hai inizializzato il tuo delegato nel ViewController?

+0

Sì, hai ragione, sto compilando l'array che contiene i dati per la tabella utilizzando il delegato dell'app. Una volta che tutte le informazioni sono state caricate nell'array, utilizzo il delegato dell'app per richiamare la funzione della tabella di aggiornamento nel controller di visualizzazione della tabella. –

+0

messaggio errato ... –