数据UITableView的模型设置,将使用UISegmentedControl进行过滤

时间:2009-05-14 02:13:08

标签: iphone objective-c cocoa-touch uikit

我正在制作一个带有UISegmented控件的UITableView,以及Phone应用程序中的Recent Calls选项卡。

第一个段将是所有项目,接下来的2个将是完整项目列表的子集。

我创建了3个数组,其中包含3个不同的数据列表。

我的第一个解决方案是批量交换数据和重新加载:

[self setData:newData];
[self.tableView reloadData];

除动画外,这种方法效果很好,没有指示数据确实已经改变。我可以添加某种指示消息,但我宁愿使用手机应用程序使用的方法,“手风琴”效果折叠已删除的单元格并扩展添加的单元格。

要做到这一点,你不能只交换数据(或者你可以?)。它不会触发动画。 我看到的唯一方法是手动删除并添加背景模型中的单元格。那么实现这一目标的有效算法是什么? 我的第一个猜测:

我有一个多维数组来表示单元格的各个部分。

  1. 创建一个数组来保存索引 要添加的单元格路径
  2. 遍历每个部分 新数据
  3. 检查新数据的部分是否与OLD数据的计数相同
  4. 如果没有,则迭代每个项目 新数据
  5. 如果该项目也在OLD数据中, 什么都不做
  6. 如果该项目不在OLD数据中, 将item的索引路径添加到要进行的单元格数组中 加入
  7. 重复
  8. 部分中的每个项目
  9. 重复新数据中的每个部分
  10. 创建一个数组来保存索引 要删除的单元格路径
  11. 遍历每个部分  旧数据
  12. 检查NEW的部分  数据与OLD具有相同的计数  数据
  13. 如果没有,则迭代每个项目  旧数据
  14. 如果该项目也在新项目中  数据,什么都不做
  15. 如果该项目不在新数据中,  将item的索引路径添加到要进行的单元格数组中  删除
  16. 重复
  17. 部分中的每个项目
  18. 重复OLD数据中的每个部分
  19. 然后调用apprpriate UITableView方法:

    - (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
    - (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
    

    这个算法似乎有很大的改进空间。有人解决了这个问题吗?你是如何实现它的?

    感谢任何输入

2 个答案:

答案 0 :(得分:0)

它看起来比它需要的更复杂。 UITableViews在“拉”的基础上工作 - 也就是说,它不是将数据推送到表上,而是调用数据源委托并将数据拉入其中。

鉴于此,每次拨打reloadData时,您都可以换出并返回您想要的任何内容。您所要做的就是使用分段控制操作来更改索引值,该值选择当表要求单元格值时,哪个数据数组是“当前”数据。

现在就动画变化而言,有很多方法可以产生相同的效果。如果你真的想要做手风琴效果,你将需要管理很多状态,以便跟踪你是处于显示模式还是桌面切换模式等。更简单的方法是设置一个可以设置动画的叠加视图并以直观的方式表明变化。然后在动画视图的完成处理程序中,您将调用reloadData

答案 1 :(得分:0)