5

我像这样删除 UITableView 中的一些行:

[tableView deleteRowsAtIndexPaths:toDelete withRowAnimation:UITableViewRowAnimationAutomatic];

这为删除操作添加了一个漂亮的动画。

但是,删除后我需要更新所有当前可见的行。打电话

[tableView reloadData];

第一次通话后立即生效,但漂亮的动画效果消失了。有什么更好的方法来做到这一点?即,动画删除操作,并更新所有当前可见的行?谢谢!

我需要这样做的原因是因为每个单元格都包含一个“复选框”。我的视图控制器是复选框的代表,每个复选框都有一个与之关联的 NSIndexPath。当复选框被切换时,会调用委托,告诉它我们切换了 x 索引路径。现在,如果删除了某些行,则需要更新索引路径。这就是为什么我需要重新加载所有内容,以便每个复选框都知道它所属的位置。

4

4 回答 4

3

在您的删除操作中使用performBatchUpdates而不是 [tableView beginUpdates] 这允许您有一个完成块

将多个插入、删除、重新加载和移动操作作为一个组进行动画处理。

self.tableView.performBatchUpdates({
     //do stuff then delete the row
     self.tableView.deleteRows(at: [indexPath], with: .fade)
}, completion: { (done) in
     //perform table refresh
     self.tableView.reloadData()

})
于 2019-01-03T19:38:33.267 回答
1

无论经过多长时间,ctrahey 的动画块都对我不起作用。我研究了UITableView的删除、插入和重载的机制。我在 Github 上维护我的项目来解决这个问题。

https://github.com/VansonLeung/VanTableController

它包括一个工作单元测试。通常为了给 UITableView 的单元格动画设置动画,我们必须做这样的事情:

[tableView_ beginUpdates];
[tableView_ deleteRowsAtIndexPaths: indexPathDelete withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView_ insertRowsAtIndexPaths: indexPathInsert withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView_ reloadRowsAtIndexPaths: indexPathReload withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView_ endUpdates];

我们必须确定删除行、插入行和重新加载行的 indexPath 数组,这是一项非常讨厌的工作!我的项目工作基本上是生成这些 indexPaths 的包装器。

于 2013-02-17T02:34:11.610 回答
0

注意: 如评论中所述,此答案可能不起作用。如果不被接受,我会删除它。

我不是 100% 确定这是最好的方法,但它有一些令人愉快的干净。reloadData修改底层模型后,我们可以在常规 UIView 动画块中进行包装:

// if self.people is a mutable array
[self.people removeObjectAtIndex:13];

[UIView animateWithDuration:0.5 animations:^{
  [self.tableView reloadData];
}];
于 2012-09-02T18:24:23.993 回答
0

我遇到了一些与之相关的问题。使用固定索引可能你会面临很多头痛。我已经解决了这个问题,向 UITableViewCell 添加了对来自我的数据源的项目的引用,而不是 NSIndexPath。因此,无需使用保存到单元格中的 indexPath。

此外,Apple 网站上有一些信息说我们不能reloadData在 insert 或 delete 方法中使用该方法。

苹果文档

所有这个方法重新加载用于构造表格的所有数据,包括单元格、节页眉和页脚、索引数组等。为了提高效率,表格视图只重新显示那些可见的行。如果表因重新加载而缩小,它会调整偏移量。表视图的委托或数据源在它希望表视图完全重新加载其数据时调用此方法。不应在插入或删除行的方法中调用它,尤其是在通过调用 beginUpdates 和 endUpdates 实现的动画块中

于 2014-09-16T11:21:37.880 回答