【问题标题】:Insert and delete rows in UITableView before first appearance on screen在屏幕上首次出现之前在 UITableView 中插入和删除行
【发布时间】:2018-06-29 21:00:54
【问题描述】:

在视图控制器启动期间,我使用insertSectionsinsertRowsdeleteRows 等执行了一系列行/节插入和删除操作。操作由后台进程的事件触发(当然,对表视图的实际调用是在主线程上执行的;而且,它们被包裹在beginUpdatesendUpdates 中)。

  • 当我在viewWillAppear 中开始这些行操作时,我最终因为行数据不一致而崩溃:attempt to delete row 1 from section 0 which only contains 1 rows before the update。发生这种情况时,更新前的部分中实际上有 2 行显然无法被表视图正确识别。
  • 但是,当我在 viewDidAppear 中启动完全相同的操作序列时,不会发生崩溃,并且行会按预期进行进出动画。

这看起来好像表格视图在出现之前存在快速运行的插入和删除序列的问题。这是一个已知的限制,还是您对此问题有其他解释?

【问题讨论】:

  • 如果视图不在屏幕上,为什么还要更新它呢?只需更新数据源即可。
  • 对于 Josh 来说,屏幕上显示的内容应该反映数据。最简单和最高效的策略(一般来说)是更新您的数据源,然后调用 reload 函数(这将调用各种 dataSource/delegate UITableView 函数)。如果您希望提前做好准备,您可以在视图控制器的初始化程序或 viewDidAppear 之前的任何地方准备数据。
  • @JoshCaswell 我的问题是关于插入/删除 API 是否可用于屏幕外表格视图,而不是这是否是一个好主意。执行这些动画的代码是框架代码,而不是特定于单个 VC,所以我希望它尽可能灵活,包括将它与刚刚出现在屏幕上的表格视图一起使用。如果 Cocoa 不支持,我可以相应地限制框架代码的使用;如果通常执行这些操作也适用于离线表视图,那么我有一个框架错误。
  • 我希望 Cocoa 写得足够好,能够在您描述的情况下具有弹性,所以我个人首先会怀疑我的代码。在 Apple Dev 论坛上询问这个可能是值得的;来自 DTS 的人可能会提供有用的意见。
  • @JoshCaswell 好点,我会在那里试试运气,除非我在接下来的几天内得到另一个答案......

标签: ios uitableview cocoa-touch


【解决方案1】:

看起来你不需要操作实际的 UITableViewCells,你可以只操作某种视图模型(普通对象),准备它们,然后在 viewWillAppear 上重新加载 UITableView

【讨论】:

  • 实际上,我就是这样做的:我有一个支持表格视图的视图模型,它是驱动我提到的插入和删除的视图模型。
猜你喜欢
  • 2011-12-09
  • 2017-12-07
  • 2010-12-22
  • 2016-03-04
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多