GOTO UPDATE
我有一个NSTreeController
控制器,它将(Content Object
)绑定到我的应用程序委托的内容(NSTreeNode *
)。我的窗口中还有NSOutlineView
绑定到我的控制器。
一切正常,内容以大纲视图显示,但我不能add
(addChild
,insert
等)通过控制器方法和canAdd
的任何项目(canAddChild
NO
等)控制器的方法总是返回@interface MyNode : NSTreeNode {
NSString* title;
}
@property (retain) NSString* title;
@end
(我有一个按钮,“启用”被绑定到控制器,这个按钮被禁用)。
我的错误在哪里?
更新
我想提供一些有关我情况的更多信息。
我有一个MyNode类:
childrenKeyPath
我的nib文件中也有NSTreeController对象。 IB中的childNodes
设置为countKeyPath
,isLeafKeyPath
和Class
为空。
控制器模式设置为MyNode
,类名称为MyDocument
。
内容对象(不是内容数组)绑定到rootNode
s @property (readonly) MyNode* rootNode;
...
rootNode = [[MyNode alloc] init];
rootNode.title = @"Root";
MyNode *childNode = [[MyNode alloc] init];
childNode.title = @"Child";
[[rootNode mutableChildNodes] addObject:childNode];
属性:
content
我的窗口中有NSOulineView,arrangedObjects
绑定到TreeController的addChild
。显示内容。我甚至可以编辑节点的标题,但是我无法通过TreeController添加或插入任何(子)节点。
我有2个按钮:与TreeController的insertChild
和canAddChild
操作相关联的“添加子项”和“插入子项”已启用绑定到canInsertChild
和@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];
TreeController的属性。按钮被禁用..我无法添加或插入任何子节点。
哪里出错?
更新2
我有一些好消息=)
我改变了我的Document类:
MyDocument.rootNodes
将内容数组(不是内容对象)绑定到rootNodes
属性,一切正常。
为什么addXXX方法不适用于单个对象?我在文档中找不到任何关于它的内容......
为什么TreeController会将根元素添加到rootNodes
? NSArray
是NSMutableArray
,而不是{{1}}。
答案 0 :(得分:0)
我想我已经拥有了!尝试将childrenKeyPath
设置为mutableChildNodes
。
答案 1 :(得分:-1)
您不应该通过编写
来添加节点[rootNodes addObject:rootNode];
相反,你应该在你的XIB / NIB文件的文件所有者(MyDocument类)中有这个:
IBOutlet NSTreeController* treeController;
将IB中的Outlet与树控制器连接起来。然后写下:
//[rootNodes addObject:rootNode];
[treeController addObject:rootNode];
通过这样做,你也可以摆脱rootNodes init:
//rootNodes = [[NSMutableArray alloc] init];
此外,要添加子节点,您可以使用
[treeController addChild:childNode];
这会将childNode添加到当前选定的节点。