我有一个小型核心数据应用。我有一个NSObjectController的子类,充当视图和模型之间的绑定,以及视图上的NSTextField,供用户输入。
当窗口打开时,文本字段是可编辑的,因为我将绑定设置为我的子类NSObjectController,控制器键设置为“content”,模型键路径设置为我的实体的属性。
如果我输入一些文字,保存文件并重新打开,NSTextField中的文字就不存在了。
为了测试,我有一个按钮连接到控制器的add:选择器,当你按下按钮一切正常 - 你可以在NSTextField中输入文本,你可以保存文件,你可以再次打开它。
如何在笔尖加载时准备对象?
在我的NSObjectController子类的init方法中,我有:
[self setAutomaticallyPreparesContent:YES];
然后我在MyDocument中:windowControllerDidLoadNib(oc是IB中子类对象控制器的IBOutlet):
[oc fetchWithRequest:nil merge:NO error:&error];
但它不起作用。我需要创建内容,以便用户可以开始输入。
由于
答案 0 :(得分:0)
好的,这是我的贡献。我很高兴能够回答一些问题!我在文档中的“NSPersistentDocument核心数据教程”中找到了这个。
请记住,我的问题是创建文档时我想创建一个NSManagedObject。这样用户就不必点击“添加”按钮。我不希望文档变脏(直到用户输入内容),如果我打开保存的文件,我不想替换内容。只有在创建新文档时才需要这样做。
NSDocument提供了一种方法:
initWithType:error:
实现这一目标。
1)抓住managedObjectContext,
2)暂时关闭撤消。这可以防止文档变脏并阻止用户撤消实体的创建和插入。
3)使用insertNewObejctForEntityForName:inManagedObjectContext
4)安装更改
5)重新开启撤消
以下是代码:
- (id)initWithType:(NSString *)typeName error:(NSError **)outError
{
self = [super initWithType:typeName error:outError];
if (self != nil) {
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
[[managedObjectContext undoManager] disableUndoRegistration];
self.myManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"myEntityName"
inManagedObjectContext:managedObjectContext];
[managedObjectContext processPendingChanges];
[[managedObjectContext undoManager] enableUndoRegistration];
NSLog(@"initWithType");
}
return self;
}