2011-10-18 52 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)