修改从NSArrayController获取的托管对象

好的,所以我正在使用Core Data构建Mac OS X应用程序。修改从NSArrayController获取的托管对象

基本布局是有一个主窗口,其中包含一个NSTableView,该窗口显示应用程序管理的所有对象的简要说明;实体很简单,包含几个字段,如标题,日期和笔记。主窗口提供添加,删除和修改条目的命令。添加或修改条目时,应用程序将显示一个新窗口,该窗口可以编辑该对象的所有属性。

编辑器窗口位于其自己的.nib中,由NSWindowController的子类进行管理,并通过调用[[SUBCLASS alloc] initWithWindowNibName:]加载。此窗口中的可编辑字段绑定到一个NSObjectController,它将管理列表中的单个条目。这个控制器没有绑定任何超出笔尖的东西;当此控制器加载时,其和content值分别设置为主要对象上下文和正在编辑的实体。

因此,添加对象的伟大工程,其作用如下:

NSEntityDescription *entityDesc = [[self.managedObjectModel entitiesByName] objectForKey: @"LogEntryEntity"]; 

LogEntryEntity *entry = (LogEntryEntity *) [[NSManagedObject alloc] initWithEntity: entityDesc

insertIntoManagedObjectContext: self.managedObjectContext];

LogEditorController *editor = [[LogEditorController alloc] initWithWindowNibName: @"LogEditorWindow"

logEntry: entry];

entry.date = [NSDate dateOneHourAgoTo30Minutes];

[editor setSaveHandler: ^(LogEditorController *c)

{

NSError *error = nil;

if (![self.managedObjectContext save: &error])

NSLog(@"Failed to save object: %@", error);

[self.logTableView reloadData];

}];

[entry release];

[editor loadWindow];

[editor showWindow: self];

删除的作品,太:

NSIndexSet *selectedIndexes = [self.logTableView selectedRowIndexes]; 

if ([selectedIndexes count] == 0)

return;

[self.logArrayController removeObjectsAtArrangedObjectIndexes: selectedIndexes];

if (![self.managedObjectContext save: &error])

NSLog(@"error saving: %@", error);

但是,当我去编辑选择的条目:

NSIndexSet *selectedIndexes = [self.logTableView selectedRowIndexes]; 

if ([selectedIndexes count] != 1)

return;

LogEntryEntity *entry = (LogEntryEntity *) [[self.logArrayController arrangedObjects] objectAtIndex: [selectedIndexes firstIndex]];

LogEditorController *editor = [[LogEditorController alloc] initWithWindowNibName: @"LogEditorWindow"

logEntry: entry];

[editor setSaveHandler: ^(LogEditorController *c)

{

NSError *error = nil;

if (![self.managedObjectContext save: &error])

NSLog(@"error saving: %@", error);

}];

[editor loadWindow];

[editor showWindow: self];

但是,这里发生的情况是,当窗口出现时,字段会填写正确条目的内容。 但是,紧接着,所有的字段被设置为某些其他条目的值(可能不是巧合,它被设置为具有所有对象中最小对象ID的那个),并且我可以确认当窗口关闭时NSObjectControllercontent值已更改为该不同的实体。当我第一次设置content时,我确认它是我想要编辑的那个。

这是怎么回事?我的意思是,很明显,我做错了什么,但我无法弄清楚什么。

回答:

我没有看到这个代码如何editor窗口可以切换LogEntryEntity对象,除非你有其他的代码或不正确的绑定编辑窗口。您传递的是特定对象而不是对象数组,因此editor窗口如何发现其他对象错误地显示?

我建议您移除此行投:

LogEntryEntity *entry = (LogEntryEntity *) [[self.logArrayController arrangedObjects] objectAtIndex: [selectedIndexes firstIndex]]; 

...因为如果由于某种原因,从数组返回的对象是不实际的一个LogEntryEntity对象,你永远不会知道。它可能是另一个managedObject或其他东西。在Objective-C中投射非常强大,编译器当然会隐式地信任它们。

以上是 修改从NSArrayController获取的托管对象 的全部内容, 来源链接: utcz.com/qa/258808.html

回到顶部