2010-02-16 14 views
19

Capisco che UITableView chiamerà il metodo -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath per ottenere ciascuna delle celle per la vista tabella. Supponiamo che la mia fonte di dati venga scaricata su Internet e devo tenere conto della latenza. Quale sarà il modo migliore per "fermare" questo metodo dall'essere chiamato? Dovrebbe bloccare su un flag booleano nell'applicazione? Dovrei semplicemente chiamare cellForRowAtIndexPath di nuovo dalla mia applicazione?Come interrompere UITableView dal caricamento fino al caricamento dei dati?

Non sono sicuro di quando viene richiamata la funzione, ovvero, quanto spesso lo "UITableView" si aggiorna da solo. Qualsiasi spiegazione sarà utile! Grazie!

risposta

37

Se non si dispone di dati o non si dispone dei dati per celle aggiuntive, non sarà chiamato cellForRowAtIndex: finché non si indica a UTableView che sono presenti rowCounts o nuovi rowCounts. Tale valore viene impostato in numberOfRowsInSection:.

In altre parole, non segnalare nuove celle in numberOfRowsInSection:, fino a quando non si dispone effettivamente di quei dati in mano, e quindi cellForRowAtIndexPath: non verrà chiamato prematuramente.

Quando si ottengono i dati della riga aggiuntiva, chiamare reloadData per ottenere UITableView per chiedere il numero di righe e quindi chiamare cellForRowAtIndex:.

+0

grazie per questa risposta. come avresti impostato numeberOfRowsInSection in seguito? quando viene chiamato reloadData, cellForRowAtIndex o numberOfRowsInSection verranno chiamati automaticamente? – Ying

+0

Sì, quando si chiama reloadData, molte di queste chiamate verranno eseguite automaticamente. – mahboudz

+5

Un altro modo per fare ciò è avere la proprietà 'UITableViews.dataSource' su zero fino a quando non sei pronto per caricarlo. Quindi lo imposti e chiama 'reloadData'. Funziona alla grande se hai solo bisogno di aspettare che una richiesta finisca per il carico iniziale della tabella. – zekel

1

Quello che dovresti fare è chiamare reloadData sulla tua vista tabella quando i tuoi dati sono stati recuperati. Ciò costringerà la vista tabella a richiamare nuovamente i metodi delegati per la visualizzazione. Questi metodi vengono chiamati ogni volta che la visualizzazione tabella deve essere nuovamente visualizzata, quindi quando viene visualizzata, lo scorrimento avviene o si richiama manualmente reloadData.

5

Se hai impostato UITableView DataSource e delegato IB allora sarà almeno andare per numberOfRowsInSection metodo quando si spinge alla vista, se si sta mostrando i dati da un NSArray, si tornerà conteggio zero se gamma è ancora vuoto, quindi la tabella non andrà per altri metodi da chiamare.

In pratica, sto tirando i dati dal servizio web per alimentare il tavolo, quindi non sono la creazione dell'origine dati e delegato da IB invece una volta che ottengo i dati e lo stato OK risposta mi piacerebbe impostare il tableview.datasource = self e tableview.delegate = self e quindi chiamare il metodo reloadData per aggiornare la tabella. Questo assicura che non andrà per il metodo numberOfRowsInSection in quanto non è necessario richiamarlo senza avere i dati.

+0

e sì, quando si imposta 'tableview.datasource = self' e' tableview.delegate = self' almeno per quel momento non è necessario chiamare 'reloadData'. – Hemang

+0

Come impedire a tableview di ricaricare i dati al momento dell'impostazione dell'origine dati? Lo voglio ricaricare manualmente, come faccio animazione dopo aver impostato l'origine dati. – Hokage

1

Quando si invoca [tableView reloadData], il framework richiama automaticamente tutti i metodi di origine dati per le celle di visualizzazione tabella attualmente visibili (non per tutte le celle di tableview). Quindi l'approccio migliore sarebbe quello di invocare reloadData ogni volta che si ottengono dati da Internet.

Problemi correlati