objective-c - 对象未从 NSOutlineView/ManagedObjectContext 中删除

标签 objective-c cocoa

我有一个 NSTreeController,它正在将对象添加到它的 addObject: 方法中。

我有一个 NSOutlineView,其内容绑定(bind)到 NSTreeController 的排列对象。

当我删除一个对象时,如下所示

- (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>)"

)

第二行是“已删除”对象。这导致 NSOutlineView 显示空白行的问题。但是,如果我关闭并重新打开我的应用程序,转储 NSFetchRequest 会显示我的托管对象实际上已被删除,并且我的 NSOutlineView 具有预期的行。

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

最佳答案

设置树 Controller 自动准备其内容(使用 moc、实体名称和获取谓词)。如果您这样做,您可能希望从 -applicationDidFinishLaunching: 中删除该代码。

来自Core Data Programming Guide: Troubleshooting Core Data :

Table view or outline view contents not kept up-to-date when bound to > an NSArrayController or NSTreeController object

Problem: You have a table view or outline view that displays a collection of instances of an entity. As new instances of the entity are added and removed, the table view is not kept in sync.

Cause: If the controller's content is an array that you manage yourself, then it is possible you are not modifying the array in a way that is key-value observing compliant.

If the controller's content is fetched automatically, then you have probably not set the controller to "Automatically prepare content."

Alternatively, the controller may not be properly configured.

Remedy: If the controller's content is a collection that you manage yourself, then ensure you modify the collection in a way that is key-value observing compliant—see “Troubleshooting Cocoa Bindings”.

If the controller's content is fetched automatically, set the "Automatically prepares content" switch for the controller in the Attributes inspector in Interface Builder (see also automaticallyPreparesContent). Doing so means that the controller tracks inserts into and deletions from its managed object context for its entity.

If neither of these is a factor, check to see that the controller is properly configured (for example, that you have set the entity correctly).

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

关于objective-c - 对象未从 NSOutlineView/ManagedObjectContext 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26351374/

相关文章:

iphone - 如何在标签中增加 NSTimer 的时间?

ios - Phonegap iOS App源码可见

objective-c - 动态 NSOutlineView 数据源

objective-c - 终止应用程序并将其替换为早期版本以进行升级安装

Xcode 版本 6.1 (6A1046a) 故障 : Xcode does not recognize any variables or objects

objective-c - CMYK NSImage 获取像素数据

ios - 初始 ViewController 根据 Storyboard中的登录更改

objective-c - 在 OSX 中为多个用户安装的系统首选项 Pane 中的 UserDefaults

objective-c - 同一主机的最大并发 NSURLConnections 数?

带键盘的 iPhone/iOS + 自定义工具栏布局