没有从NSOutlineView / ManagedObjectContext中删除对象

时间:2014-10-14 01:34:59

标签: objective-c cocoa

我有一个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具有预期的行。

我错过了什么吗?我是以错误的方式添加对象吗?我应该使用不同的绑定吗?非常感谢任何帮助。

1 个答案:

答案 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为其托管对象上下文插入和删除   它的实体。

     

如果这些都不是因素,请检查控制器是否正常   正确配置(例如,您已设置实体   正确地)。

因此,除非将树控制器设置为自动准备内容,否则树控制器不会跟踪对托管对象上下文的插入和删除。