经过几个小时/天的搜索和潜入示例项目后,我得出结论,我只需要问一下。如果我将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.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];
}
答案 0 :(得分:9)
我遇到了类似的情况,即(IKImageBrowserView)没有初始化,即使ArrayController最终会与NSManagedObjectContext同步。
最终在核心数据编程指南中找到了这段话
如果“自动准备内容”标志(例如,请参阅 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];
...
}