我有一个NSTableView,其NSTableColumn的值绑定到NSArrayController。 arrayController在我的核心数据托管对象上下文中控制一组实体。

它运行良好,并且当通过UI Actions将新实体插入到arrayController中时,tableView选择了新项目。

但是,我将以编程方式在moc中创建新实体,然后在arrayController中选择新对象。

我尝试了以下方法:

Image *newImage = [Image newImage]; // convenience method to insert new entity into mod.
newImage.title = [[pathToImage lastPathComponent] stringByDeletingPathExtension];
newImage.filename = [pathToImage lastPathComponent];

[self.primaryWindowController showImage:newImage];


showImage:方法是这样的:

- (void)showImage:(Image *)image
{
    [self.imagesArrayController fetch:self];
    [self.imagesArrayController setSelectedObjects:@[image]];
}


但是,arrayController不会更改其选择。

我做错了吗?我假设我在moc中创建的newImage对象与arrayController正在控制的对象相同。如果是这样,为什么arrayController不更改其选择?

嗯-测试这个假设,我现在在运行时检查了arrayController的内容。新图像不存在-我认为这意味着我已经通过手动插入到Moc中而在绑定的“后面”了。

我的newImage便捷方法是这样的:

+ (Image *)newImage
{
    Image *newImage = [NSEntityDescription insertNewObjectForEntityForName:@"Image" inManagedObjectContext:[[CoreDataController sharedController] managedObjectContext]];
    return newImage;
}


这不符合KVO吗?

hmmm-编辑2 ...

我假定它是KVO兼容的,因为新图像出现在UI中。我现在正在考虑将实体插入Moc和通知arrayController之间存在延迟。

我从这个问题New Core Data object doesn't show up in NSArrayController arrangedObjects(由SO正确显示在该问题的右边)中看到,要求arrayController提取:应该有助于更新arrayController,但实际的提取:直到下一次运行runloop时才会发生。

我应该使用计时器延迟选择新对象吗?看起来有点不雅...

最佳答案

正确-已解决此问题,这要归功于以下问题:New Core Data object doesn't show up in NSArrayController arrangedObjects

插入新对象后,我必须直接在Moc上调用processPendingChanges:。

因此,现在我的新创建便捷方法是:

+ (Image *)newImage
{
    Image *newImage = [NSEntityDescription insertNewObjectForEntityForName:@"Image" inManagedObjectContext:[[CoreDataController sharedController] managedObjectContext]];
    [[[CoreDataController sharedController] managedObjectContext] processPendingChanges];
    return newImage;
}

07-25 22:51