核心数据:如何在添加NSManagedObject后立即更新NSArrayController?

时间:2013-05-14 19:05:46

标签: macos cocoa core-data nsmanagedobject nsarraycontroller

我在核心数据中添加了一个实例。该实体由NSArrayController表示。我想通过控制器访问新添加的实例。

添加了“技能”实例,然后我尝试通过selectAddedObject访问它,如下所示:

-(void)addSkill
{
    [self selectAddedObject:[NSEntityDescription insertNewObjectForEntityForName:@"Skill"
                                                          inManagedObjectContext:self.managedObjectContext]];
}

- (void)selectAddedObject:(NSManagedObject *)addedMO
{
    [self.sectionArrayController setSelectedObjects:[NSArray arrayWithObject:addedMO]];
    NSLog(@"Selected: %@", [self.sectionArrayController valueForKey:@"selectedObjects"]);
}

如果我添加

,这似乎才有用
[self.managedObjectContext processPendingChanges];

作为selectAddedObject:的第一行。但是一旦我这样做,该文档似乎忘记它仍然需要保存,我可以退出应用程序而不添加自动保存。不想强迫用户使用!

关于以某种方式立即更新阵列控制器的方法的任何想法?或者也许以另一种方式添加对象?由于OSX的变化,一些早期的答案(例如Updating NSTableView when enitiy is added to core data)似乎有点过时了。

谢谢!

1 个答案:

答案 0 :(得分:1)

使用阵列控制器添加对象。在配置期间的某个时刻,确保设置实体([self.sectionArrayController setEntityName:@"Skill"]),然后完成所有工作以创建并选择:

- (void)createAndSelectNewObject
{
    Skill *addedMO = [self.sectionArrayController newObject];

    if([self.sectionArrayController commitEditing]) {

        [self.sectionArrayController setSelectedObjects:[NSArray arrayWithObject:addedMO]];
        NSLog(@"Selected: %@", [self.sectionArrayController valueForKey:@"selectedObjects"]);
    }
}

您应该在更改选择之前提交任何编辑(并且只有在提交编辑或没有编辑时才更改选择。)