2010-02-16 62 views
19

據我所知,UITableView將調用-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法來獲取表視圖的每個單元格。假設我的數據源是通過互聯網獲取的,我必須考慮延遲。什麼是停止這種方法被調用的最佳方式?它應該阻止應用程序中的布爾標誌嗎?我是否應該在我的應用程序中再次撥打cellForRowAtIndexPath如何停止加載UITableView直到獲取數據?

我不確定該函數何時被調用,即UITableView本身「刷新」的頻率。任何解釋都會有幫助!謝謝!

回答

37

如果您沒有數據,或者您沒有其他單元格的數據,則只要您不告訴UTableView您有rowCounts或新的rowCounts,則不會調用cellForRowAtIndex:。該值在numberOfRowsInSection:中設定。

換句話說,不要報告numberOfRowsInSection:中的任何新單元格,直到您實際掌握了這些數據,然後cellForRowAtIndexPath:不會被過早地調用。

當您獲取附加行數據時,請致電reloadData以獲取UITableView以詢問行數,然後致電cellForRowAtIndex:

+0

感謝您的回答。以後如何設置numeberOfRowsInSection?當reloadData被調用時,cellForRowAtIndex或numberOfRowsInSection會自動調用嗎? – Ying 2010-02-17 00:51:02

+0

是的,當你調用reloadData時,這些調用將會自動進行。 – mahboudz 2010-02-17 07:17:55

+5

另一種方法是在您準備好加載它之前,將「UITableViews.dataSource」屬性設置爲零。然後你設置它並調用'reloadData'。如果您只需要等待一個請求完成初始表加載,則此功能非常有用。 – zekel 2012-10-15 13:45:46

1

你應該做的是在數據完成讀取時在你的表視圖上調用reloadData。這將強制表視圖再次調用它的委託方法進行顯示。無論何時需要重新顯示錶視圖,都會調用這些方法,因此無論是何時顯示,滾動還是您手動調用reloadData。

5

如果您已經設置了UITableView數據源和IB代理,那麼當您推送到視圖時,它至少會使用numberOfRowsInSection方法,但是如果顯示的數據來自NSArray,則它將返回計數ZERO,如果數組仍然是空的,所以表格不會用於其他方法的調用。

在實踐中,我是從Web服務將數據提取喂表,所以我不設立從IB的數據源和委託,而不是一旦我得到的數據和狀態OK響應我設置tableview.datasource = selftableview.delegate = self然後調用reloadData方法更新表。這確保它不會用於numberOfRowsInSection方法,因爲您不需要在沒有數據的情況下調用它。

+0

和是的,當你設置'tableview.datasource = self'和'tableview.delegate = self'至少在那段時間你不需要調用'reloadData'。 – Hemang 2015-01-29 04:37:18

+0

如何防止tableview在設置數據源時重新加載數據?我希望它手動重新加載,因爲我在設置數據源之後做動畫。 – Hokage 2015-10-02 04:16:18

1

當您調用[tableView reloadData]時,框架會自動爲當前可見的表視圖單元格(不是爲tableview的所有單元格)再次調用所有數據源方法。所以最好的方法是每次從互聯網獲取數據時調用reloadData。

相關問題