描述:
应用程序启动时会创建一个包含 3 行的 TableView 。如果点击导航栏中的添加按钮,则会在 TableView 中添加新行。添加行操作背后的核心流程是方法
func insertRows(at:, with:)
。Apple documents许多堆栈溢出答案(例如 this one )建议将任何插入、删除或选择 TableView 的行和部分的方法调用放在函数
beginUpdates()
和endUpates 之间()
.我删除了
beginUpdates()
和endUpdates()
;事实证明,即使没有它们,应用程序也能正常工作。问题:
添加
beginUpdates()
和endUpdates()
有什么好处?我为什么问这个问题:
函数
func insertRows(at:, with:)
正在调用委托(delegate)函数tableView(_:, cellForRowAt:) -> UITableViewCell
通过以下方式创建一个新单元格dequeueReusableCell(withIdentifier:, for:) -> UITableViewCell
,这与tableView
在应用启动时创建 3 个默认行的过程相同,但是,没有这样的beginUpdates
/endUpdates
那里。那么为什么我需要稍后在添加新行时添加此过程,而没有它们应用程序似乎仍然可以工作?
最佳答案
要对行和节的批量插入、删除和重新加载进行动画处理,请在通过连续调用 beginUpdates
和 endUpdates
定义的动画 block 中调用相应的方法。如果不在该 block 内调用插入、删除和重新加载方法,则行索引和节索引可能无效。对 beginUpdates
和 endUpdates
的调用可以嵌套;所有索引都被视为只有外部更新 block 。
在 block 结束时(即 endUpdates
返回后), TableView 会像往常一样查询其数据源和委托(delegate)以获取行和节数据。因此,支持 TableView 的集合对象应该更新以反射(reflect)新的或删除的行或部分。
关于ios - 当新行插入 tableView 时,我是否必须调用 begin/endUpdates 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44699266/