我有一个NSTreeController,它正在添加对象addObject:
方法。
我有一个NSOutlineView,其内容绑定到NSTreeController的arrangeObjects。
删除对象时,如下所示
- (void) deleteSelectionConfirmed {
id selectedItem = [_outlineView itemAtRow:[_outlineView selectedRow]];
id obj = ((NSTreeNode *)selectedItem).representedObject;
NSManagedObjectContext *context = [self managedObjectContext];
[context deleteObject:obj];
NSError *error;
NSLog(@"%hhd", [[self managedObjectContext] hasChanges]);
if (![context save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
} else {
NSLog(@"%@", [_hostController content]);
[_outlineView reloadData];
}
NSLog(@"%hhd", [[self managedObjectContext] hasChanges]);
}
它似乎没有被删除。
我的treeController内容打印出来就是这样。
"<Host: 0x6080000b41c0> (entity: Host; id: 0x608000034180 <x-coredata://6E3284F6-D870-4DAF-A4E5-B6A4EB75021E/Host/p131> ; data: {\n hostname = asdfasdf;\n index = 0;\n children = \"<relationship fault: 0x60800022ecc0 'children'>\";\n title = gggg;\n username = asdf;\n})",
"<Host: 0x6080002a0960> (entity: Host; id: 0x608000032a80 <x-coredata://6E3284F6-D870-4DAF-A4E5-B6A4EB75021E/Host/p133> ; data: <fault>)"
)
第二行是删除的&#39;宾语。这导致NSOutlineView出现问题以显示空白行。但是,如果我关闭重新打开我的应用程序,则转储NSFetchRequest会显示我的Managed对象实际上已被删除,而我的NSOutlineView具有预期的行。
我错过了什么吗?我是以错误的方式添加对象吗?我应该使用不同的绑定吗?非常感谢任何帮助。
答案 0 :(得分:1)
将树控制器设置为自动准备其内容(使用moc,实体名称和获取谓词)。如果您这样做,您可能希望从-applicationDidFinishLaunching:
中删除该代码。
来自Core Data Programming Guide: Troubleshooting Core Data:
表格视图或大纲视图内容在绑定到&gt;时未保持最新NSArrayController或NSTreeController对象
问题:您有一个显示的表格视图或大纲视图 实体实例的集合。作为实体的新实例 添加和删除,表视图不会保持同步。
原因:如果控制器的内容是您管理的阵列 你自己,有可能你没有以某种方式修改阵列 这是符合键值观察的。
如果自动提取控制器的内容,那么你就拥有了 可能没有将控制器设置为&#34;自动准备内容。&#34;
或者,可能未正确配置控制器。
补救措施:如果控制器的内容是您管理的集合 你自己,然后确保你以一种方式修改集合 键值观察符合 - 见“Troubleshooting Cocoa Bindings”。
如果自动获取控制器的内容,请设置 &#34;自动准备内容&#34;切换控制器 Interface Builder中的属性检查器(另请参见
automaticallyPreparesContent
)。这样做意味着控制器 track为其托管对象上下文插入和删除 它的实体。如果这些都不是因素,请检查控制器是否正常 正确配置(例如,您已设置实体 正确地)。
因此,除非将树控制器设置为自动准备内容,否则树控制器不会跟踪对托管对象上下文的插入和删除。