使用reloadData作为UITableView上的保险单

时间:2012-04-01 03:48:21

标签: iphone ios uitableview

我的UITableView有一个相当复杂的数据源。我非常小心地将它与tableview本身同步,每当某些数据发生变化时手动插入和删除行/部分(带动画),反之亦然。

很难对我保持这些匹配的能力100%有信心。视图和数据之间不匹配的影响可能非常严重 - 例如,选择一行并尝试对关联对象执行某些操作(当该对象不存在时)将导致崩溃。许多其他错误会导致不太明显的错误(例如,对错误的对象进行操作)。

如果我在每次数据更改后调用reloadData而不是手动修改视图,我就会考虑如何消除这一切。但后来我会失去动画。

所以也许我可以在我的动画结束后以某种方式调用reloadData 作为安全措施。

  • 这听起来像个好主意吗?任何替代方案?
  • 我将在何处进行此调用,以便重新加载仅在动画之后发生(如果一切正常,则对用户不可见)?
  • 我可以做些什么来比较reloadData之前和之后的视图,以确定屏幕上是否有任何更改并发出警告,以进行调试?我希望这只适用于视图中的行,因为屏幕外内容仅在需要时才会出列。

对你的想法感兴趣!

2 个答案:

答案 0 :(得分:3)

我感觉到你的痛苦。不幸的是,我不认为重新加载的想法有多大帮助。如果模型和表视图之间存在差异,根据我的经验,问题在更新动画之前或期间显示为异常。如果有问题,我发现你没有进行重装,我认为你不想这样做。

根据我的经验,这些是一些风险因素导致模型容易与表格视图不同步:

  • 来自更复杂计算的模型计数和模型项 比简单的数组计数和数组itemAtIndex:
  • 过滤器,例如根据选择的选项卡在同一个表中显示模型的不同方面的选项卡
  • 搜索结果控制器及其tableView
  • 基于异步触发的事件进行更新
  • 模型中的异质类型,具有不同的细胞类型和大小
  • 一个笨拙的词:FetchedResultsController
  • ,尤其是上述
  • 的组合

这远远超出了表格视图,并且,我并不认为这是所有讲道的完美实践者,但我认为让您对应用程序充满信心的方式包括以下内容:

  1. 构建没有艺术的UI,尽可能少的app逻辑;只是一个 模型的模拟版本 - 尽可能 - 等于 真实的东西,复杂但不是数量。

  2. 在一定程度上构建模型和应用程序逻辑以及测试 可能 - 独立于UI运用它。

  3. 在您进行测试时,请将异常视为您的朋友,告诉您需要修复。 尽可能长时间插入尽可能少的防御性代码

  4. 我的0.02美元。祝你好运。

答案 1 :(得分:0)

您可以在插入/删除行动画的任何位置添加此行代码。

   [self performSelector:@selector(reloadTheTable) withObject:nil afterDelay:0.3];  




-(void) reloadTheTable {
    [tableView reloadData];
}

然而,如果有更多的时间,我认为你可以弄清楚如何删除添加没有错误的行,然后不需要额外的reloadData,但你的表可能比我使用的更复杂。