1

转到更新

我有一个NSTreeController控制器,将 ( Content Object) 绑定到我的应用程序委托的内容 ( NSTreeNode *)。我NSOutlineView的窗口中也有绑定到我的控制器。

一切正常,内容显示在大纲视图中,但我不能addaddChildinsert)任何项目,尽管控制器方法和canAddcanAddChild等)控制器方法总是返回NO(我有一个“启用”的按钮绑定到控制器和这个按钮被禁用)。

我的错误在哪里?

更新

我想提供更多关于我的情况的信息。

我有一个 MyNode 类:

@interface MyNode : NSTreeNode {
    NSString* title;
}

@property (retain) NSString* title;


@end

我的 nib 文件中也有 NSTreeController 对象。在IBchildrenKeyPath中设置为和为空。childNodescountKeyPathisLeafKeyPath

控制器模式设置为Class,类名称为MyNode

内容对象(不是内容数组)绑定到MyDocumentsrootNode属性:

@property (readonly) MyNode* rootNode;

...

rootNode = [[MyNode alloc] init];
rootNode.title = @"Root";

MyNode *childNode = [[MyNode alloc] init];
childNode.title = @"Child";

[[rootNode mutableChildNodes] addObject:childNode];

我的窗口中有 NSoulineViewcontent绑定到 TreeController 的arrangedObjects. 显示内容。我什至可以编辑节点的标题,但无法通过 TreeController 添加或插入任何(子)节点。

我有 2 个按钮:“添加子项”和“插入子项”连接到 TreeController 的addChildinsertChild操作,并启用绑定到 TreeController 的canAddChildcanInsertChild属性。按钮被禁用..我无法添加或插入任何子节点。

错在哪里?

更新 2

我有一些好消息 =)

我像这样更改了我的 Document 类:

@interface MyDocument : NSDocument {
    NSMutableArray *rootNodes;
    MyNode* rootNode;
}

@property (readonly) NSArray* rootNodes;

..

rootNodes = [[NSMutableArray alloc] init];

rootNode = [[MyNode alloc] init];
rootNode.title = @"Root";

MyNode* childNode = [[MyNode alloc] init];
childNode.title = @"Child";

[[rootNode mutableChildNodes] addObject:childNode];

[rootNodes addObject:rootNode];

并将内容数组(不是内容对象)绑定到MyDocument.rootNodes属性,一切正常。

为什么 addXXX 方法不适用于单个对象?我在文档中找不到任何关于它的信息......

为什么 TreeController 可以将根元素添加到rootNodes? rootNodesNSArray,不是NSMutableArray

4

2 回答 2

0

I think I've got it! Try setting childrenKeyPath to mutableChildNodes.

于 2011-09-12T18:37:53.667 回答
-1

您不应该通过编写来添加节点

[rootNodes addObject:rootNode];

相反,您应该在您的 XIB/NIB 文件(MyDocument 类)的文件所有者中拥有它:

IBOutlet NSTreeController* treeController;

并将 IB 中的这个 Outlet 与你的 Tree Controller 连接起来。然后只写:

//[rootNodes addObject:rootNode];
  [treeController addObject:rootNode];

通过这样做,您还可以摆脱 rootNodes init:

//rootNodes = [[NSMutableArray alloc] init];

此外,要添加子节点,您可以使用

[treeController addChild:childNode];

这会将 childNode 添加到当前选定的节点。

于 2011-12-12T15:48:59.140 回答