启动应用程序时,将创建一个具有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
。那么,为什么我以后添加新行时需要添加此过程,而没有它们,应用程序似乎仍然可以运行? 最佳答案
要设置行和节的批量插入,删除和重新加载的动画效果,请在连续调用beginUpdates
和endUpdates
定义的动画块中调用相应的方法。如果您未在此块中调用插入,删除和重新加载方法,则行索引和节索引可能无效。可以嵌套对beginUpdates
和endUpdates
的调用;所有索引都被视为只有外部更新块。
在块结束时(即endUpdates
返回之后),表视图查询其数据源,并照常委托行和节数据。因此,应该更新支持表视图的集合对象,以反映新的或删除的行或节。
Apple Docs
关于ios - 将新行插入tableView时,是否必须调用begin/endUpdates方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44699266/