无法执行操作,因为childrenKeyPath为nil

时间:2013-09-13 02:50:53

标签: objective-c macos crash osx-lion nstreecontroller

当我尝试将孩子插入NSTreeController时,为什么会出现此崩溃错误?

NSTreeController *tree = [NSTreeController new];
NSTreeNode *node1 = [NSTreeNode treeNodeWithRepresentedObject:@{ @"type": @"shirt" }];

// The below method causes mysterious crash
[tree insertObject:node1 atArrangedObjectIndexPath:[NSIndexPath indexPathWithIndex:0]];

Xcode说:

  

*由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'[object class:NSMutableDictionary]无法执行操作,因为childrenKeyPath为nil'       *

为什么会导致此错误?什么是childrenKeyPath以及我为什么需要它(我没有使用界面构建器)?

1 个答案:

答案 0 :(得分:2)

我在这里犯了几个错误。您不应将NSTreeNode类型的实例插入NSTreeController insertObject。您可以使用insertObject插入模型对象,此时NSTreeNode自动为其创建。

此外,在模型对象中,您需要拥有一个设置为NSMutableArray的属性或键。然后,在插入任何模型对象之前,将childrenKeyPath的{​​{1}}属性设置为等于该属性或键的名称。

这是因为NSTreeControllerNSTreeController并非设计用于保存数据或子对象本身,而是作为模型的简单但有用的“地图”创建并保留。

我希望这些信息对其他人有所帮助,因为StackOverflow的其余部分对它有些奇怪的沉默......