2011-10-18 11 views
33

Ho molti dati e molte righe nella mia tabellaView. quando i dati cambiano Voglio aggiornare le mie celle visibili sullo schermo, davvero non voglio usare reloadData perché è una chiamata costosa.iOS - UITableView aggiorna la tabella correttamente?

È possibile aggiornare in qualche modo solo le celle visibili? Ho provato a chiamare: beginUpdate & endUpdate sul tavolo, ma che non funziona sempre?

Qualche suggerimento?

+0

Sei sicuro reloadData è costoso? Mi aspetto che sia abbastanza economico, purché non si utilizzino altezze variabili. Sta andando a interrogare quante sezioni hai nella tabella, quante righe in ogni sezione, ed elimina la sua cache. Ma le celle saranno ricaricate su richiesta, il che significa che solo le celle visibili dovrebbero essere ricaricate. –

+0

Se vuoi aggiornare tutte le celle _visible_ allora reloadData non dovrebbe essere ** ** costoso. – Nevin

+0

@StevenFisher Sì nel mio caso è molto costoso, ho molti calcoli, come l'altezza richiesta delle celle e alcune chiamate web. Quindi probabilmente avrei dovuto dire che è costoso per il mio caso. – aryaxt

risposta

86

È possibile:

[tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows] 
       withRowAnimation:UITableViewRowAnimationNone]; 
+0

molto bello, grazie. Questa è una soluzione perfetta specialmente quando si tratta di ricaricare una singola cella. – aryaxt

+0

cosa succede se l'utente successivamente scorre verso una cella che non era visibile al momento della chiamata? vedrà informazioni obsolete, immagino? – dancl

+2

Le celle non visibili non vengono popolate con i dati. Sono popolati non appena vengono visualizzati, tramite i richiami delle origini dati della vista tabella. –

-1

Prova a chiamare 'deleteRowsAtIndexPaths', un metodo di UITableView, proprio dopo aver eliminato il modello dall'origine dati. Ad esempio, se si sta eliminando una riga in modalità di modifica, è possibile scrivere qualcosa come il seguente codice. Si noti che la prima riga del 'se' dichiarazione rimuove l'oggetto dall'origine dati, e la seconda linea pulisce la tabella:

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     [[[[[ItemsStore sharedStore] parameterArray] objectAtIndex:indexPath.section] objectForKey:@"data"] removeObjectAtIndex:indexPath.row]; 

     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

    } 
} 
0

Per Swift 3:

tableView.reloadRows(at: tableView.indexPathsForVisibleRows!, with: .none) 
Problemi correlati