2012-04-24 48 views
0

我有一個應用程序UITableViewController,最初只有一個單一的部分行(它說「加載...」)。它會獲取一些數據來自互聯網,此時它讓下面的調用:UITableView reloadSection會導致爲所有行調用cellForRowAtIndexPath

[tableView reloadSections:[NSIndexPath indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade]; 

這是必要的,因爲獲取數據後,有現在的很多行,而不僅僅是1有最初(所以問表視圖中可見單元格的列表的可能性也不大,因爲它只是返回1舊)

麻煩的是,它然後調用cellForRowAtIndexPath委託方法每一行,不僅僅是可見的。我已經通過將一些日誌記錄放入方法來驗證。如果我將這一行切換到簡單的[tableView reloadData],那麼它只會在前幾行調用cellForRowAtIndexPath,直到您滾動的點和其他人進入視野。這發生在我的iOS4 iPod Touch上,也發生在iOS5模擬器中。

我有大約300行,它使它非常緩慢加載,並通常在我的iPod Touch上崩潰。

我不是僅僅使用reloadData的原因是我想添加新的行來動畫,而reloadData只是讓它們突然出現。

回答

1

你可以這樣做:

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

我已經編輯了我的問題並加以澄清:'indexPathsForVisibleRows' isn這是一個選項,因爲底層數據已經改變,並且它只返回一箇舊的單元格(它不包括任何應該添加的新行) – andygeers 2012-04-24 15:39:41

+0

okey,你是對的,不是一個選項然後;)但我想,如果你調用[NSIndexPath indexSetWithIndex:0],tableView必須加載所有單元格/數據,因爲tableView應該如何知道,如果末尾沒有任何數據段0你提供的數據。 – Quirin 2012-04-24 15:46:07

+1

但是,如果是這樣的話,爲什麼'reloadData'足夠聰明以便正確? – andygeers 2012-04-24 15:47:16

0

這是我使用的是什麼添加行表:

NSMutableArray *indexPathsToInsert = [[NSMutableArray alloc] init]; 

    for (NSInteger i = previousTableDataCount; i < [tableData count]; i++) { 
     [indexPathsToInsert addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 
    } 

    // Apply the updates. 
    [tableView beginUpdates]; 

    [tableView insertRowsAtIndexPaths:indexPathsToInsert withRowAnimation:UITableViewRowAnimationNone]; 
    [tableView endUpdates]; 

它不會重新加載所有數據,它只是插入新現有tableView底部的行。 tableData數組是表的數據源數組,並且previousTableDataCount是indexData和tableData數組在從互聯網插入新數據之前的索引...

+0

我不知道這會有所幫助 - 鑑於表開始時單行,這基本上必須加載*所有的單元格,對嗎? – andygeers 2012-04-26 14:50:00

相關問題