UITableView细胞同时具有UIActivityIndi​​cator& UIProgressView

时间:2011-02-04 23:11:26

标签: iphone performance uitableview uiactivityindicatorview reloaddata

我有一个包含多个单元格的UITableView,其中一些(仍在上传的文件)同时具有UIActivityIndi​​cator和UIProgressView。完成的文件使用不同的图标(而不是活动指示符)并隐藏进度视图。

此表使用NSFetchedResultsController作为数据源,因此我获取了数据模型的更新并更新了内容。

一切正常。然而,问题在于性能。每当我调用 reloadData 时,我的UIActivityIndi​​cators闪烁,并且它不是很流畅。虽然我是从nib文件缓存的,但 reloadData 必须计算ProgressView的新进度%,除了上传完成后我不会对ActivityIndi​​cator做任何事情。 p>

有人试过类似的东西吗?有解决方法吗?

我正在考虑使用我的progressview引用数组并使用它而不是调用reloadData ..不确定这是否是正确的方法。

谢谢,

费尔南多

1 个答案:

答案 0 :(得分:1)

当您在 UITableView 上调用reloadData时,表视图的所有单元格都会被完全刷新,重新组合并重新绘制。所有旧的都扔掉了。这意味着 UITableViewCells 的所有子视图也将被删除并重新创建(包括 UIActivityIndi​​cator UIProgressView )。刷新会导致这些视图闪烁,或者可能会跳回其开始状态。由于无法设置 UIActivityIndi​​cator 的框架,因此您无法恢复某些进度值的建议。

相反,也许您应该尝试设计“刷新”以不需要完全刷新表格?例如,如果要在视图中更改 UITextField 的文本,则只需访问此文本字段并设置text属性(不需要刷新)。或者,如果要隐藏进度指示器,可以进入相应的对象实例并设置其属性。你应该设计你的应用程序,以便这是可能的。以这种方式进行更改可以避免从头开始重新加载单元格。

除了修复问题的好处之外,使用这种更新方法,您还应该看到性能大幅提升。 reloadData是一种非常昂贵的使用方法,只有在绝对需要从头开始重新创建整个 UITableView 时才能使用它。

希望这会有所帮助。 :)