如何以编程方式使用CoreData行填充NSArrayController?

And*_*oud 1 macos cocoa core-data objective-c nsarraycontroller

经过几个小时/几天的搜索和潜入示例项目,我得出结论,我只需要问.如果我将assetsView(IKImageBrowserView)直接绑定到IB实例,那么NSArrayController一切正常.

- (void) awakeFromNib
{
    library = [[NSArrayController alloc] init];
    [library setManagedObjectContext:[[NSApp delegate] managedObjectContext]];
    [library setEntityName:@"Asset"];       

    NSLog(@"%@", [library arrangedObjects]);
    NSLog(@"%@", [library content]);

    [assetsView setDataSource:library];
    [assetsView reloadData];
}
Run Code Online (Sandbox Code Playgroud)

两者NSLogs都是空的.我知道我错过了什么......我只是不知道是什么.目标是最终允许使用谓词以编程方式过滤此视图的"库"的多个实例.现在我只是想让它显示"Asset"实体的所有行.

另外:如果我NSArrayController在IB中创建然后尝试记录[library arrangedObjects]或手动设置assetsView的数据源,我会得到相同的空结果.就像我之前说的那样,如果我绑定library.arrangedObjects到IB中的assetsView.content(IKImageBrowserView) - 具有相同的托管对象上下文和IB设置的相同实体名称 - 一切都按预期工作.

- (void) awakeFromNib
{
//  library = [[NSArrayController alloc] init];
//  [library setManagedObjectContext:[[NSApp delegate] managedObjectContext]];
//  [library setEntityName:@"Asset"];       

    NSLog(@"%@", [library arrangedObjects]);
    NSLog(@"%@", [library content]);

    [assetsView setDataSource:library];
    [assetsView reloadData];
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*ter 9

我遇到了类似的情况,即(IKImageBrowserView)没有初始化,即使ArrayController最终会与NSManagedObjectContext同步.

最终在核心数据编程指南中找到了这段话

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdBindings.html#//apple_ref/doc/uid/TP40004194-SW3

如果为控制器设置了"自动准备内容"标志(例如,参见setAutomaticallyPreparesContent :),则使用控制器的当前提取谓词从其管理对象上下文中获取控制器的初始内容.重要的是要注意,控制器的提取是在设置了托管对象上下文之后执行的延迟操作(通过nib加载)执行的 - 因此在awakeFromNib和windowControllerDidLoadNib:之后发生.如果要在这些方法中的任何一种方法中使用对象控制器的内容执行操作,这可能会产生问题,因为控制器的内容为nil.您可以通过使用fetchWithRequest执行"手动"提取来解决此问题:merge:error:.

- (void)windowControllerDidLoadNib:(NSWindowController *) windowController
{
[super windowControllerDidLoadNib:windowController];

NSError *error = nil;
BOOL ok = [arrayController fetchWithRequest:nil merge:NO error:&error];
// ...
Run Code Online (Sandbox Code Playgroud)