【问题标题】:iOS - UITableView refresh table properly?iOS - UITableView 正确刷新表?
【发布时间】:2011-10-18 00:54:04
【问题描述】:

我的 tableView 中有很多数据和很多行。 当数据更改时,我想更新屏幕上的可见单元格,我真的不想使用 reloadData,因为这是一个昂贵的调用。

是否可以仅以某种方式更新可见单元格? 我试过在桌子上打电话:beginUpdate & endUpdate,但这不是一直有效吗?

有什么建议吗?

【问题讨论】:

  • 你确定 reloadData 很贵吗?只要您不使用可变高度,我希望它会非常便宜。它将查询您在表中有多少个部分,每个部分中有多少行,并清除其缓存。但是单元格会按需重新加载,这意味着只应重新加载可见单元格。
  • 如果您要刷新所有 可见 单元格,那么 reloadData 不应该那么昂贵。
  • @StevenFisher 是的,就我而言,它非常昂贵,我有很多计算,例如所需的单元格高度和一些网络调用。所以我可能应该说这对我来说很昂贵。
  • 是的,如果你正在做可变高度单元,它可能非常昂贵。感谢您的澄清。 :)

标签: iphone ios uitableview


【解决方案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];
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多