当将新行插入表视图时,是否必须调用 begin/endUpdates 方法?


  1. 描述:

    启动应用时,将创建包含 3 行的表视图。如果点击,导航栏中的添加按钮会将新行添加到表视图中。添加行操作背后的核心过程是方法func insertRows(at:, with:)

    Apple 文档和许多堆栈溢出答案(例如,这个)建议将任何插入、删除或选择表视图的行和部分的方法调用放在函数beginUpdates()endUpates()之间。

    我删除了beginUpdates()endUpdates();事实证明,该应用程序在没有它们的情况下运行良好。

  2. 问题:

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

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

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

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

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

苹果文档

相关内容

最新更新