我有一个核心数据模型,该模型由特定实体的简单树组成,该实体具有两个关系,分别为parent
和children
。我有一个NSTreeController
管理模型,其中NSOutlineView
绑定到NSTreeController
。
我的问题是我需要一个根对象,但是该对象不应显示在大纲视图中,而仅其子对象应显示在大纲视图的顶层。如果我在Interface Builder中将NSTreeController
的获取谓词设置为parent == nil
,则一切工作正常,除了在大纲视图中将根项显示为顶级项之外。
我的实体具有属性isRootItem
,该属性仅对根项目有效。
我的模型如下所示:
Node 1
|
+-Node 2
| |
| +-Node 5
|
Node 3
|
Node 4
大纲视图应如下所示:
(来源:menumachine.com)
我需要在大纲视图的顶层显示节点2、3和4(节点1应该不可见),但它们的父节点仍然是“节点1”。节点1的
YES
值为isRootItem
,所有其他节点的值为NO
。如果我将树控制器的提取谓词设置为
parent.isRootItem == 1
,则会正确显示树,但是一旦我将新项添加到顶层,它就会失败,因为树控制器没有将“不可见”根项分配为新项目的父项。有没有办法在这种情况下使
NSTreeController
/ NSOutlineView
组合起作用? 最佳答案
我最后要做的是将NSTreeController子类化,并覆盖-insertObject:atArrangedObjectIndexPath:
以直接将父对象设置为我的根对象,如果要插入的对象正在树的顶层插入。这似乎工作可靠。
显然,需要更多的工作来处理移动的项目并插入多个项目,但这似乎是最好的方法。
- (void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath
{
NodeObject* item = (NodeObject*)object;
//only add the parent if this item is at the top level of the tree in the outline view
if([indexPath length] == 1)
{
//fetch the root item
NSEntityDescription* entity = [NSEntityDescription entityForName:@"NodeObject" inManagedObjectContext:[self managedObjectContext]];
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init]; //I'm using GC so this is not a leak
[fetchRequest setEntity:entity];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"isRootItem == 1"];
[fetchRequest setPredicate:predicate];
NSError* error;
NSArray* managedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
if(!managedObjects)
{
[NSException raise:@"MyException" format:@"Error occurred during fetch: %@",error];
}
NodeObject* rootItem = nil;
if([managedObjects count])
{
rootItem = [managedObjects objectAtIndex:0];
}
//set the item's parent to be the root item
item.parent = rootItem;
}
[super insertObject:object atArrangedObjectIndexPath:indexPath];
//this method just sorts the child objects in the tree so they maintain their order
[self updateSortOrderOfModelObjects];
}
关于cocoa - 如何将NSTreeController,NSOutlineView和Core Data与“不可见”的根项目一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1678637/