Objective c NSTreeController add和addChild方法

Objective c NSTreeController add和addChild方法,objective-c,cocoa,add,nstreecontroller,Objective C,Cocoa,Add,Nstreecontroller,转到更新 我有一个NSTreeController控制器,它将内容对象绑定到我的应用程序委托的内容NSTreeNode*。此外,我的窗口中有绑定到控制器的NSOutlineView 一切正常,内容显示在大纲视图中,但我无法添加addChild、insert等任何项目,尽管控制器的控制器方法和CanAddCanAddChild等方法始终返回否我有一个已启用的按钮绑定到控制器,此按钮已禁用 我的错在哪里 更新 我想提供更多关于我的情况的信息 我有一个MyNode类: @interface MyNod

转到更新

我有一个NSTreeController控制器,它将内容对象绑定到我的应用程序委托的内容NSTreeNode*。此外,我的窗口中有绑定到控制器的NSOutlineView

一切正常,内容显示在大纲视图中,但我无法添加addChild、insert等任何项目,尽管控制器的控制器方法和CanAddCanAddChild等方法始终返回否我有一个已启用的按钮绑定到控制器,此按钮已禁用

我的错在哪里

更新

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

我有一个MyNode类:

@interface MyNode : NSTreeNode {
    NSString* title;
}

@property (retain) NSString* title;


@end
我的nib文件中还有NSTreeController对象。childrenKeyPath设置为IB中的childNodes,countKeyPath和isLeafKeyPath为空

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

内容对象非内容数组绑定到MyDocuments rootNode属性:

@property (readonly) MyNode* rootNode;

...

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

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

[[rootNode mutableChildNodes] addObject:childNode];
我的窗口中有NSOulineView,它的内容绑定到TreeController的arrangedObjects。将显示内容。我甚至可以编辑节点的标题,但我不能通过TreeController添加或插入任何子节点

我有两个按钮:Add Child和Insert Child连接到TreeController的addChild和insertChild操作,enabled绑定到TreeController的canAddChild和canInsertChild属性。按钮被禁用。。我不能添加或插入任何子节点

错误在哪里

更新2

我有一些好消息=

我更改了文档类,如下所示:

@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是NSArray,而不是NSMutableArray。

我想我找到了!尝试将childrenKeyPath设置为mutableChildNodes。

不应通过写入来添加节点

[rootNodes addObject:rootNode];
相反,您应该在XIB/NIB File MyDocument类的文件所有者中包含以下内容:

IBOutlet NSTreeController* treeController;
并将IB中的此插座与树控制器连接。然后写下:

//[rootNodes addObject:rootNode];
  [treeController addObject:rootNode];
通过这样做,您还可以摆脱rootNodes init:

//rootNodes = [[NSMutableArray alloc] init];
此外,要添加子节点,可以使用

[treeController addChild:childNode];

这将向当前选定的节点添加一个子节点。

如何设置NSTreeNode实例?他们的代表对象是什么?内容=[[NSTreeNode alloc]init];它们没有表示对象。那么NSOutlineView显示什么内容呢?只有空单元格,但结构正常。我还创建了一个带有title属性的NSTreeNoge子类,并将outline view列绑定到它-显示正常,但add和insert方法不起作用。我认为您的问题是节点需要支持插入和更新才能起作用。不过,我完全困惑不解。您说结构正常,所以必须实例化一堆NSTreeNodes。如何将子节点分配给其父节点?你能从应用程序代理中发布相关代码吗?它也不起作用。。见我的更新2。当我使用内容数组而不是内容对象时,我对mutableChildNodes有一个例外。因此,正确的修复方法是:1使用内容数组绑定而不是内容对象绑定,2提供根节点数组而不是单个根节点-对吗?我不明白根节点是NSArray,不是NSMutableArray。1。不,我的更新2不是一个正确的修复程序。文档中说树的根内容对象可以是单个对象,也可以是一个对象数组,但是add:和insert:方法不适用于单个对象。我不明白为什么。2.抱歉,我的英语=rootNodes是NSArray类型的属性。NSArray没有像addObject:这样的方法。TreeController如何通过此属性插入元素?没问题。在确定rootNodes实例可以响应的选择器时,属性声明和实例变量声明都不重要。树控制器只是简单地询问它是否可以响应,例如addObject:,它回答是。编译器使用类型系统来检查选择器名称和参数类型,Xcode使用它来完成属性,但Obj-C中没有任何内容阻止代码使用实例定义的任何选择器。