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

时间:2011-02-15 10:10:10

标签: objective-c cocoa macos core-data nsarraycontroller

经过几个小时/天的搜索和潜入示例项目后,我得出结论,我只需要问一下。如果我将assetsView(IKImageBrowserView)直接绑定到NSArrayController的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];
}

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

添加:如果我在IB中创建NSArrayController然后尝试记录[library arrangedObjects]或手动设置assetsView的数据源,我会得到相同的空结果。就像我之前所说的,如果我将library.arrangedObjects绑定到IB中的assetsView.contentIKImageBrowserView) - 具有相同的托管对象上下文和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];
}

3 个答案:

答案 0 :(得分: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:如果您愿意,这可能会产生问题   在这些方法中的任何一个中使用对象控制器的内容执行操作,   因为控制器的内容是零。您可以通过执行提取来解决此问题   使用fetchWithRequest“手动”:merge:error:。

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

NSError *error = nil;
BOOL ok = [arrayController fetchWithRequest:nil merge:NO error:&error];
// ...

答案 1 :(得分:0)

看起来问题是你实际上没有告诉NSArrayController取任何东西。在通过绑定或手动添加对象之前,NSArrayControllers为空。

设置库后尝试调用其获取方法:

[library fetch:self];

此外,您可能已经知道这一点,但可以使用以下方法在代码中设置绑定:

- (void)bind:(NSString *)binding toObject:(id)observableController withKeyPath:(NSString *)keyPath options:(NSDictionary *)options

答案 2 :(得分:0)

如果继承NSArrayCotroller或通过视图控制器

,也可以在awakeFromNib中添加
-(void)awakeFromNib
{
    [self fetchWithRequest:nil merge:NO error:nil];

    ...
}