我有一个核心数据模型,该模型由特定实体的简单树组成,该实体具有两个关系,分别为parentchildren。我有一个NSTreeController管理模型,其中NSOutlineView绑定到NSTreeController

我的问题是我需要一个根对象,但是该对象不应显示在大纲视图中,而仅其子对象应显示在大纲视图的顶层。如果我在Interface Builder中将NSTreeController的获取谓词设置为parent == nil,则一切工作正常,除了在大纲视图中将根项显示为顶级项之外。

我的实体具有属性isRootItem,该属性仅对根项目有效。

我的模型如下所示:

Node 1
|
+-Node 2
  |   |
  |   +-Node 5
  |
  Node 3
  |
  Node 4


大纲视图应如下所示:

cocoa - 如何将NSTreeController,NSOutlineView和Core Data与“不可见”的根项目一起使用?-LMLPHP
(来源: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/

10-09 19:05