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