2011-10-18 75 views
33

我在我的tableView中有很多數據和很多行。 當數據發生變化時我想更新屏幕上的可見單元格,我真的不想使用reloadData,因爲這是一個昂貴的調用。iOS - UITableView正確刷新表?

是否有可能以某種方式更新可見單元格? 我試過撥打電話:beginUpdate & endUpdate在桌子上,但這並不是一直工作?

有什麼建議嗎?

+0

你肯定reloadData是昂貴?我希望它很便宜,只要你不使用可變高度。它將查詢表中有多少部分,每部分有多少行,並清除其緩存。但是細胞會根據需求重新加載,這意味着只有可見細胞應該重新加載。 –

+0

如果你要刷新所有的_visible_單元格,那麼reloadData不應該**那**很貴。 – Nevin

+0

@StevenFisher是的,在我的情況下,它是非常昂貴的,我有很多的計算,如所需的單元格高度和一些網絡調用。所以我應該說我的情況很貴。 – aryaxt

回答

86

您可以:

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

非常好,謝謝。特別是在重新加載單個單元時,這是一個完美的解決方案。 – aryaxt

+0

如果用戶稍後滾動到該通話發出時不可見的單元格,會發生什麼情況?他會看到過時的信息我猜? – dancl

+2

不可見的單元不填充數據。它們在屏幕上通過表視圖的數據源回調進行填充。 –

-1

嘗試調用「deleteRowsAtIndexPaths」,UITableView中的方法,您從數據源中刪除模型之後。例如,如果您在編輯模式下刪除一行,則可以編寫類似下面的代碼。需要注意的是,在第一行的「如果」語句從數據源中的對象,而第二行清理表:

-(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

對於斯威夫特3:

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