将新行插入tableView时,是否必须调用begin / endUpdates方法?

时间:2017-06-22 12:20:19

标签: ios swift xcode tableview tableviewcell

  1. 说明:

    启动应用程序时会创建一个包含3行的表视图。如果点击,导航栏中的添加按钮将在表格视图中添加新行。添加行操作背后的核心流程是方法func insertRows(at:, with:)

    Apple documents和许多堆栈溢出答案(例如,this one)建议在函数beginUpdates()之间插入,删除或选择表视图的行和部分的任何方法调用和endUpates()

    我删除了beginUpdates()endUpdates();事实证明,没有它们,应用就可以正常工作。

  2. 问题:

    添加beginUpdates()& endUpdates()

  3. 为什么我会问这个问题:

    函数func insertRows(at:, with:)正在调用委托函数tableView(_:, cellForRowAt:) -> UITableViewCell以通过dequeueReusableCell(withIdentifier:, for:) -> UITableViewCell创建一个新单元格,这与tableView创建3个默认行时的程序相同应用已启动,但是,那里没有beginUpdates / endUpdates。那么为什么我在以后添加新行时需要添加此过程,而没有它们,应用程序似乎仍然有效?

1 个答案:

答案 0 :(得分:2)

要为行和节的批量插入,删除和重新加载设置动画,请在连续调用beginUpdatesendUpdates定义的动画块中调用相应的方法。如果不在此块中调用插入,删除和重新加载方法,则行和节索引可能无效。可以嵌套对beginUpdatesendUpdates的调用;所有索引都被视为只有外部更新块。

在一个块结束时 - 也就是说,在endUpdates返回之后 - 表视图查询其数据源并像往常一样委托行和段数据。因此,应更新支持表视图的集合对象以反映新的或删除的行或节。

Apple Docs