NSObjectController - setAutomaticallyPreparesContent:

时间:2009-12-29 16:47:11

标签: nsobject

我有一个小型核心数据应用。我有一个NSObjectController的子类,充当视图和模型之间的绑定,以及视图上的NSTextField,供用户输入。

当窗口打开时,文本字段是可编辑的,因为我将绑定设置为我的子类NSObjectController,控制器键设置为“content”,模型键路径设置为我的实体的属性。

如果我输入一些文字,保存文件并重新打开,NSTextField中的文字就不存在了。

为了测试,我有一个按钮连接到控制器的add:选择器,当你按下按钮一切正常 - 你可以在NSTextField中输入文本,你可以保存文件,你可以再次打开它。

如何在笔尖加载时准备对象?

在我的NSObjectController子类的init方法中,我有:

[self setAutomaticallyPreparesContent:YES];

然后我在MyDocument中:windowControllerDidLoadNib(oc是IB中子类对象控制器的IBOutlet):

[oc fetchWithRequest:nil merge:NO error:&error];

但它不起作用。我需要创建内容,以便用户可以开始输入。

由于

1 个答案:

答案 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;
}