代码之家  ›  专栏  ›  技术社区  ›  Rob Keniger

如何将NSTreeController、NSOutlookView和核心数据与“不可见”根项一起使用?

  •  3
  • Rob Keniger  · 技术社区  · 16 年前

    parent children NSTreeController NSOutlineView .

    parent == nil

    isRootItem

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

    大纲视图应如下所示:

    Outline View Image
    (来源: menumachine.com

    YES 为了 NO .

    parent.isRootItem == 1

    2 回复  |  直到 7 年前
        1
  •  2
  •   Rob Keniger    16 年前

    我最终做的是将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];
    }
    
        2
  •  0
  •   Abizern    16 年前

    addChild: 方法?

    太多