【问题标题】:Do I have to call begin/endUpdates method when a new row is inserted into the tableView?将新行插入 tableView 时是否必须调用 begin/endUpdates 方法?
【发布时间】:2017-11-25 17:24:24
【问题描述】:
  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 那里。那么为什么我需要在稍后添加新行时添加此过程,而没有它们,应用程序似乎仍然可以工作?

【问题讨论】:

  • 我删除了 beginUpdates() 和 endUpdates() 事实证明,没有它们,应用程序工作得很好。 --> 如果没有重新加载数据,它怎么能正常工作,你使用 beginUpdates() 和 endUpdates 或重新加载数据以更新/动画您的 tableview
  • @AmritTiwari 你能否停止复制和粘贴其他人的答案,例如这个:stackoverflow.com/a/23260386/3004698
  • Option-单击beginUpdates 并阅读弹出窗口。它用于对您想要一次全部设置动画的多个插入或删除进行分组。单个插入或删除不需要begin/endUpdates

标签: ios swift xcode tableview tableviewcell


【解决方案1】:

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

在一个块结束时——即在endUpdates 返回之后——表视图像往常一样查询其数据源和委托以获取行和节数据。因此,支持 table view 的集合对象应该更新以反映新的或删除的行或节。

Apple Docs

【讨论】:

    猜你喜欢
    • 2019-10-09
    • 2022-12-20
    • 1970-01-01
    • 2018-05-15
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    相关资源
    最近更新 更多