在UITableView更新块中组合moveSection:toSection,insertSections:和deleteSections :.

时间:2012-10-27 00:35:18

标签: ios uitableview

UITableView documentation表示可以将moveSection:toSection:insertSections:withRowAnimation:deleteSections:withRowAnimation:的来电合并到beginUpdates - {{1}阻止。 “表视图编程指南”中的一个名为Batch Insertion, Deletion, and Reloading of Rows and Sections的部分还解释了在更新块内混合插入和删除时,无论方法调用的顺序如何,表视图都会在插入之前执行删除操作。< / p>

我的问题是,当对endUpdates的调用与对moveSection:toSection:insertSections:的调用相结合时,表格视图的移动顺序是什么?或者, fromSection toSection 是指删除之前,删除和插入之间,还是插入之后的部分索引?

1 个答案:

答案 0 :(得分:6)

在尝试使用某些代码后,似乎考虑beginUpdates - endUpdates块内的一批更改的最佳方法是在任何更新之前的各个部分的顺序应用并应用所有更新后的部分顺序。如果 U 表示更新块之前的顺序,而 V 表示更新块之后的顺序,那么deleteSections:调用中使用的部分索引和moveSection:toSection: U 中的索引,insertSections:中使用的部分索引和moveSection:toSection:调用中的目标索引是 V <中的索引/ em>的

因此,例如,为更改设置动画:

  0   C   ->   A   0
  1   F        H   1
  2   H        C   2
  3   K        K   3

你可以使用:

[tableView deleteSections:@[1] withRowAnimation:UITableViewRowAnimationAutomatic]; // delete F
[tableView insertSections:@[0] withRowAnimation:UITableViewRowAnimationAutomatic]; // insert A
[tableView moveSection:2 toSection:1]; // move H
[tableView moveSection:0 toSection:2]; // move C (implied by other changes so not necessary)

如果所做的其他更改暗示了一组移动,则无需明确地进行这些移动。例如,将A部分旋转到表格的底部:

  0   A   ->   B  0
  1   B        C  1
  2   C        D  2
  3   D        A  3

以下在逻辑上是等价的:

[tableView moveSection:0 toSection:3];

[tableView moveSection:1 toSection:0];
[tableView moveSection:2 toSection:1];
[tableView moveSection:3 toSection:2];

然而,它们的动画略有不同。在第一种情况下,A部分动画向下移动,而在第二种情况下,向上移动的三部分在A部分上动画。

最后,似乎在动画一组涉及向下移动的部分以及向上移动的部分的动画时,不移动的部分位于底部,向下移动的部分位于其上方,并且向上移动的部分位于顶部。