我有一个NSOutlineView,显示来自我的Core Data商店的数据。使用链接到我的managedObjectContext的NSarrayController呈现数据,并使用NSTreeController在NSOutlineView中显示(很像描述here)。我想过滤使用NSPredicate(或其他东西)显示的数据,但我无法使其工作。请注意,这是OSX而不是iOS,所以我不能使用NSFetchedResultsController。
我能够检索正确的数据并将它们存储在NSArray中。但是,仅使用过滤后的数据启用我在outlineview中看到的内容的自动更新不起作用。这就是我目前所拥有的:
[arrayController setManagedObjectContext:_coreDataHelper.context];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SDRDFileObject"
inManagedObjectContext:_coreDataHelper.context];
[request setEntity:entity];
NSNumber *directionLimit = @1;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"direction = %@", directionLimit];
[request setPredicate:predicate];
NSError *error;
[arrayController setContent:[_coreDataHelper.context executeFetchRequest:request error:&error]];
[_coreDataHelper.context reset];
[arrayController fetch:self];
[outlineView reloadData];
正如您所看到的,我的问题接近one,但我仍在努力。如果我确实使用setContent为arrayController工作,我还假设我会遇到与Core Data上下文和arrayController内容不匹配的问题。建议或如何正确执行此操作的示例非常感谢。
答案 0 :(得分:1)
建议1:尝试放弃阵列控制器。
我不完全确定你指引我们的第一个链接的作者的目标是什么,但他/她做了一些事情,至少在最常见的NSOutlineView
设置中,是一点点奇。从Core Data中提取值并在大纲视图中显示它们所需的唯一控制器对象是NSTreeController
。另一方面,教程建议插入一个数组控制器:“在你的NIB文件中,你需要一个绑定到NSManagedObjectContext的数组控制器,设置为Entity模式,并使用父级的获取谓词== nil。这将获取我们的顶级对象 - 没有父级的实体。“我的观点是,这是您应该使用树控制器而不是阵列控制器。考虑到这一点,我认为您应该做的第一件事就是只使用树形控制器正确显示数据,一旦实现了这一点,您就可以开始考虑过滤大纲视图了。
建议2:过滤
与NSArrayController
不同,NSTreeController
个对象在其类引用中没有filterPredicate
。我不确定为什么会这样,但是在大纲视图中你必须自己实现过滤行为。这可能有点棘手,但并不太难。例如,在我的一个项目中,我有一个大型的拖放兼容树控制器/大纲视图设置,当你在位于左下角的搜索栏中键入内容时,它会影响Xcode过滤文件的方式。我通过向NSTreeController
添加一个名为-filterContentUsingPredicate
的类别并返回一个数组来完成此操作。过滤完成后,我使用[-NSTreeController setContent:
]调用来更新大纲视图的内容以反映过滤器。