gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:51:08 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com