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 正确刷新表?的主要内容,如果未能解决你的问题,请参考以下文章

UITableView之局部刷新的正确使用姿势

iOS开发UI篇—实现UITableview控件数据刷新

iOS UITableView 刷新

IOS怎么实现一个UITableView的下拉刷新

UITableView 在更新 NSFetchedResultsController 时保持滚动在正确的位置

UITableView 在 iOS 上不刷新