这是一个最佳实践问题,因为我可以想到一些可行的方法。
我想实现一个大纲视图。假设我想在 OmniFocus 中实现一个(我的目标非常相似):
(我指的是该屏幕截图主窗格中的大纲视图,而不是侧边栏。)
所以我的数据类型是一个任务。任何任务都可以有子任务。每个任务都有一个或零个父任务。用于在大纲视图中显示的经典数据模型,对吧?
但!我想为用户提供通过他们选择的属性直观地对这些任务进行分组的能力。他们可以按里程碑、分配的用户或组件对它们进行分组……会有很多这样的。并且这个分组应该出现在大纲视图中,在层次结构的顶层,就像这个 OmniFocus 屏幕截图中的“收件箱”、“家庭”和“工作”项目一样。
所以很明显,要显示分组,我应该使用内置的 NSOutlineView 方法来绘制组单元:outlineView:isGroupItem:
委托方法。问题是,此设置假设大纲视图中的每个项目都由我连接到的任何数据模型中的项目表示:因此我的任务和我的组标题都必须在数据模型中表示。
因此,只绑定到代表我的任务的核心数据表是不行的。我可以完全放弃绑定,而只是回到旧式数据源方法,但是我失去了一堆有用的东西。那么有中间立场吗?
例如,我可以创建另一个类TaskTemporaryGroup
。我给该类一个 ivar NSSet ,即subtasks
与可用于获取其子项的任务的键路径相同。然后我可以将我的一组 TaskTemporaryGroup 对象绑定到一个树控制器,它会安排整个树,而不管顶层项目与较低级别的项目是不同的类。在实现拖放时,我必须小心,以确保不能随意拖动分组行,但它可能会起作用。
另一个争论点是我想点击表格标题来对每个组中的行进行排序,而不是对顶级组进行排序。我假设 NSTreeController 将排序描述符应用于层次结构的每个级别?对于我希望能够对其余单元格进行排序的任何关键路径,我可以让我的 TaskTemporaryGroup 类返回相同的东西(即,它所需的排序顺序,我已经单独计算),以便框架无论按什么属性对它们进行排序,它们看起来都保持相同的顺序。这是一个好方法还是一个黑客?
所以,总结一下:
- 人们如何建议我实现这种层次结构,其中顶层是一个特例,所有后续级别都是同一种对象?
- 我描述的方式,用一个类来表示碰巧响应与子对象相同的关键路径的顶级对象,是一个好方法吗?
- 有没有人有关于如何在这种情况下使排序正常工作的任何提示?
- 或者尝试使用绑定来完成这项任务会给我带来伤害吗?
谢谢,
艾米