• 说明:

    启动应用程序时,将创建一个具有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。那么,为什么我以后添加新行时需要添加此过程,而没有它们,应用程序似乎仍然可以运行?
  • 最佳答案

    要设置行和节的批量插入,删除和重新加载的动画效果,请在连续调用beginUpdatesendUpdates定义的动画块中调用相应的方法。如果您未在此块中调用插入,删除和重新加载方法,则行索引和节索引可能无效。可以嵌套对beginUpdatesendUpdates的调用;所有索引都被视为只有外部更新块。

    在块结束时(即endUpdates返回之后),表视图查询其数据源,并照常委托行和节数据。因此,应该更新支持表视图的集合对象,以反映新的或删除的行或节。

    Apple Docs

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

    10-10 18:06