修改从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的那个),并且我可以确认当窗口关闭时NSObjectController
的content
值已更改为该不同的实体。当我第一次设置content
时,我确认它是我想要编辑的那个。
这是怎么回事?我的意思是,很明显,我做错了什么,但我无法弄清楚什么。
回答:
我没有看到这个代码如何editor
窗口可以切换LogEntryEntity
对象,除非你有其他的代码或不正确的绑定编辑窗口。您传递的是特定对象而不是对象数组,因此editor
窗口如何发现其他对象错误地显示?
我建议您移除此行投:
LogEntryEntity *entry = (LogEntryEntity *) [[self.logArrayController arrangedObjects] objectAtIndex: [selectedIndexes firstIndex]];
...因为如果由于某种原因,从数组返回的对象是不实际的一个LogEntryEntity
对象,你永远不会知道。它可能是另一个managedObject或其他东西。在Objective-C中投射非常强大,编译器当然会隐式地信任它们。
以上是 修改从NSArrayController获取的托管对象 的全部内容, 来源链接: utcz.com/qa/258808.html