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