UITableView删除并重新加载单元格

时间:2012-09-02 16:22:06

标签: objective-c ios cocoa-touch uitableview

我在UITableView中删除了一些行,如下所示:

[tableView deleteRowsAtIndexPaths:toDelete withRowAnimation:UITableViewRowAnimationAutomatic];

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

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

[tableView reloadData];
在第一次调用之后

,但是漂亮的动画效果消失了。有什么更好的方法呢?即,为删除操作设置动画,并更新所有当前可见的行? 谢谢!

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

4 个答案:

答案 0 :(得分: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数组,这是一个非常讨厌的工作!我的项目工作基本上是生成这些indexPath的包装器。

答案 1 :(得分:0)

我遇到了一些与之相关的问题。使用固定索引可能会遇到很多麻烦。我已经解决了这个从UITableViewCell添加对我的数据源中的Item的引用,而不是NSIndexPath。因此,无需使用保存在单元格中的indexPath。

另外,Apple网站上有一些信息说我们不能在插入或删除方法中使用reloadData方法。

Apple docs

  

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

答案 2 :(得分:0)

在删除操作中,使用 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()

})

答案 3 :(得分:-1)

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

我并非100%确定这是最佳方式,但有一些令人愉快的清洁方法。修改底层模型后,我们可以将reloadData包装在常规UIView动画块中:

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

[UIView animateWithDuration:0.5 animations:^{
  [self.tableView reloadData];
}];