我希望有人可以澄清UITableView
beginUpdates()
和endUpdates()
的使用情况。
如果我有多项更改(deleteRows
,insertRows
,moveRow
等),我是否应该使用后续呼叫,就像之前的呼叫已经完成一样?
例如:
我的数据是[A,B,C](假设只有1个部分),我已将我的数据源更新为[B,D,C],我希望删除A,然后在B和B之间插入D C,我应该做以下事情:
tableView.beginUpdates()
tableView.deleteRows(at: [IndexPath(row: 0, section: 0), with: .automatic)
tableView.insertRows(at: [IndexPath(row: 1, section: 0), with: .automatic)
tableView.endUpdates()
我认为删除会在插入之前发生或
tableView.beginUpdates()
tableView.deleteRows(at: [IndexPath(row: 0, section: 0), with: .automatic)
tableView.insertRows(at: [IndexPath(row: 2, section: 0), with: .automatic)
tableView.endUpdates()
删除不会发生的地方?
我使用的是Swift 4,虽然以iOS 9为目标,因此我无法专门使用performBatchUpdates
。非常感谢。
答案 0 :(得分:1)
我想我已经找到了我正在寻找的澄清。从https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/TableView_iPhone/ManageInsertDeleteRow/ManageInsertDeleteRow.html开始,标题为“行和段的批量插入,删除和重新加载”以及“操作和索引路径的排序”小标题
您可能已经注意到代码清单7-8中显示的某些内容似乎很奇怪。代码在调用insertRowsAtIndexPaths:withRowAnimation:之后调用deleteRowsAtIndexPaths:withRowAnimation:方法。但是,这不是UITableView完成操作的顺序。在处理行或节的删除之前,它会延迟任何行或节的插入。表视图的行为与在更新块内部调用的重新加载方法的行为相同 - 在执行动画块之前,相对于行和段的索引进行重新加载。无论插入,删除和重新加载方法调用的顺序如何,都会发生此行为。
动画块中的删除和重新加载操作指定应删除或重新加载原始表中的哪些行和部分; insertions指定应将哪些行和部分添加到结果表中。用于标识节和行的索引路径遵循此模型。另一方面,在可变数组中插入或移除项目可能会影响用于连续插入或移除操作的数组索引;例如,如果在某个索引处插入项目,则数组中所有后续项目的索引都会递增。
虽然这几乎无法解析,但我认为这意味着问题中的第二个例子是正确的。