说明:
启动应用程序时会创建一个包含3行的表视图。如果点击,导航栏中的添加按钮将在表格视图中添加新行。添加行操作背后的核心流程是方法func insertRows(at:, with:)
。
Apple documents和许多堆栈溢出答案(例如,this one)建议在函数beginUpdates()
之间插入,删除或选择表视图的行和部分的任何方法调用和endUpates()
。
我删除了beginUpdates()
和endUpdates()
;事实证明,没有它们,应用就可以正常工作。
问题:
添加beginUpdates()
& endUpdates()
?
为什么我会问这个问题:
函数func insertRows(at:, with:)
正在调用委托函数tableView(_:, cellForRowAt:) -> UITableViewCell
以通过dequeueReusableCell(withIdentifier:, for:) -> UITableViewCell
创建一个新单元格,这与tableView
创建3个默认行时的程序相同应用已启动,但是,那里没有beginUpdates
/ endUpdates
。那么为什么我在以后添加新行时需要添加此过程,而没有它们,应用程序似乎仍然有效?
答案 0 :(得分:2)
要为行和节的批量插入,删除和重新加载设置动画,请在连续调用beginUpdates
和endUpdates
定义的动画块中调用相应的方法。如果不在此块中调用插入,删除和重新加载方法,则行和节索引可能无效。可以嵌套对beginUpdates
和endUpdates
的调用;所有索引都被视为只有外部更新块。
在一个块结束时 - 也就是说,在endUpdates
返回之后 - 表视图查询其数据源并像往常一样委托行和段数据。因此,应更新支持表视图的集合对象以反映新的或删除的行或节。