ios - 当新行插入 tableView 时,我是否必须调用 begin/endUpdates 方法?

标签 ios swift xcode tableview uitableview

  1. 描述:

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

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

    我删除了beginUpdates()endUpdates();事实证明,即使没有它们,应用程序也能正常工作。

  2. 问题:

    添加 beginUpdates()endUpdates() 有什么好处?

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

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

最佳答案

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

在 block 结束时(即 endUpdates 返回后), TableView 会像往常一样查询其数据源和委托(delegate)以获取行和节数据。因此,支持 TableView 的集合对象应该更新以反射(reflect)新的或删除的行或部分。

Apple Docs

关于ios - 当新行插入 tableView 时,我是否必须调用 begin/endUpdates 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44699266/

相关文章:

ios - 如何使用 CloudKit 将记录添加到记录类型的引用列表?

ios - watchOS 通知安静地传递

ios - 使用 AppDelegate 中的 Reachibility block 检查整个应用程序的连接性

ios - Facebook Audience Network Framework SDK 5.3.2 错误

ios - 以编程方式更改 imageview 高度 ios

ios - 如何使用SwiftUI在多个屏幕上获取键盘高度并移动按钮

ios - swift 将元组作为 AnyObject 传递

ios - xcodebuild-exportArchive : exportOptionsPlist error for key 'method' : expected one of {}

ios - 如果某些库是在arm中编译的,那是否意味着我不能在模拟器中使用它?

iOS 和界面生成器 : misplaced view (e. g。 UITableViewCell)