0

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

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

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

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

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

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

[self setAutomaticallyPreparesContent:YES];

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

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

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

谢谢

4

1 回答 1

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;
}  
于 2009-12-29T20:43:11.020 回答