iOS - UITableView 正确刷新表?
Posted
技术标签:
【中文标题】iOS - UITableView 正确刷新表?【英文标题】:iOS - UITableView refresh table properly? 【发布时间】:2011-10-18 00:54:04 【问题描述】:我的 tableView 中有很多数据和很多行。 当数据更改时,我想更新屏幕上的可见单元格,我真的不想使用 reloadData,因为这是一个昂贵的调用。
是否可以仅以某种方式更新可见单元格?
我试过在桌子上打电话:beginUpdate
& endUpdate
,但这不是一直有效吗?
有什么建议吗?
【问题讨论】:
你确定 reloadData 很贵吗?只要您不使用可变高度,我希望它会非常便宜。它将查询您在表中有多少个部分,每个部分中有多少行,并清除其缓存。但是单元格会按需重新加载,这意味着只应重新加载可见单元格。 如果您要刷新所有 可见 单元格,那么 reloadData 不应该那么昂贵。 @StevenFisher 是的,就我而言,它非常昂贵,我有很多计算,例如所需的单元格高度和一些网络调用。所以我可能应该说这对我来说很昂贵。 是的,如果你正在做可变高度单元,它可能非常昂贵。感谢您的澄清。 :) 【参考方案1】:你可以:
[tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows]
withRowAnimation:UITableViewRowAnimationNone];
【讨论】:
如果用户稍后滚动到调用时不可见的单元格会发生什么?我猜他会看到过时的信息? 不可见的单元格不会填充数据。当它们出现在屏幕上时,它们会通过表格视图的数据源回调进行填充。【参考方案2】:对于 Swift 3:
tableView.reloadRows(at: tableView.indexPathsForVisibleRows!, with: .none)
【讨论】:
【参考方案3】:尝试在从数据源中删除模型后立即调用 UITableView 的方法“deleteRowsAtIndexPaths”。例如,如果您在编辑模式下删除一行,您可以编写如下代码。请注意,'if' 语句中的第一行从数据源中删除对象,第二行清理表:
-(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];
【讨论】:
以上是关于iOS - UITableView 正确刷新表?的主要内容,如果未能解决你的问题,请参考以下文章