使用NSTreeController / NSOutlineView添加子对象

时间:2010-09-19 12:02:59

标签: objective-c cocoa nsoutlineview nstreecontroller

在我的应用程序中,像许多Mac应用程序一样,我有一个源列表。目前这是绑定到NSTreeController的NSOutlineView。我可以很容易地添加项目,甚至可以复制“源列表”外观,灰色全帽标题和所有。但是,有些事情会让我感到厌恶,这让我感到疯狂。

如何将孩子添加到树中的特定项目?例如,假设我创建了一个名为“Cheese”的项目。我已经给奶酪添加了两个孩子,叫做“Cheddar”和“Swiss”。现在我的初始添加方法已经完成运行,如何将“Longhorn Colby”添加到子项列表中?

我用谷歌搜索了它,但找不到一个简单直接的答案。然而,从我所看到的情况来看,这是不必要的复杂,类似于要求国会采取像吃早餐这样简单的事情。如果我错了,请纠正我。

更新

我不相信我正在使用子类型。到目前为止,这是我如何填充我的树:

[treeController addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                               [NSNumber numberWithBool:YES], @"isSourceGroup",
                               @"CHEESE", @"name",
                               [NSArray arrayWithObjects:
                                [NSDictionary dictionaryWithObjectsAndKeys:
                                 @"Cheddar", @"name",
                                 nil],
                                [NSDictionary dictionaryWithObjectsAndKeys:
                                 @"Swiss", @"name",
                                 nil],
                                nil], @"children",
                               nil]];

“isSourceGroup”位用于表示此项目是大纲视图中的标题之一。

2 个答案:

答案 0 :(得分:2)

尝试将NSArray更改为NSMutableArray,然后:

[treeController insertObject:longhornColbyDict atArrangedObjectIndexPath:[[NSIndexPath indexPathWithIndex:0] indexPathByAddingIndex:0]];

答案 1 :(得分:1)

假设每个TypeOfFood都有一个包含数组的subtypes属性,并且该属性在树控制器中设置为节点的子键路径,请将Cheese类型的食物发送给insertObject:inSubtypesAtIndex:信息。 (您需要在TypeOfFood类中实现该访问器。)

由于这是一个符合KVC标准的访问者,当树控制器开始观察属性时,KVO会将其包装起来,这意味着发送访问者消息应足以使正确的通知跳闸并产生右侧效果 - 即更新控制器和视图。

我没有使用过NSTreeController,所以我完全有可能错过了它的某些方面,这使得这个答案变得虚假。无论发生什么事情,请尝试并评论。