父级折叠时,NSOutlineView parentForItem返回nil

时间:2016-01-09 01:30:06

标签: objective-c macos cocoa nsoutlineview

我有一个NSOutlineView我写了datasourcedelegate。当我向组中添加项目并且组项目处于折叠状态时,parentForItem会返回nil

这是我用来测试它的代码。

- (IBAction)addItemToGroup:(id)sender {
    TLItem *theNewItem= [[TLItem alloc] initWithTitle:@"My New Item"];
    TLItem *theGroupItem = [self.sourceListItems objectAtIndex:0];
    NSMutableArray *theItemList = [theGroupItem children];
    [theItemList addObject:theNewItem];
    [self.sourceListOutlineView reloadData];
    TLItem *newItemParent = [self.sourceListOutlineView parentForItem:theNewItem];
    NSLog(@"newItemParent = %@", newItemParent);
}

如果扩展了GroupItem,则此方法记录此:

newItemParent = TLItem: 0x60800004bbb0

如果theGroupItem已折叠,则此方法会记录此:

 newItemParent = (null)

如何获取新添加项目的父级?

注意:我意识到这是一个愚蠢的例子,但在我的实际代码中,我需要能够走到树上找到层次结构中的所有父母。

1 个答案:

答案 0 :(得分:4)

鉴于您已编写数据源,请使用该数据源而不是大纲视图来导航层次结构。数据源是模型的权限。大纲视图只是展示该模型某些部分的一种方式。在一般情况下,大纲视图不会完整地表示模型,并且通常需要查阅数据源来回答此类查询。所以,跳过中间人并直接前往源头。

如有必要,您的项目类应具有对其父项的弱引用。层次结构上的所有操作(添加子节点,删除子节点,将项目从一个父节点移动到另一个父节点等)应该通过数据源上的专用方法来保持父节点引用的更新。除了这些特定于层次结构操作的方法之外,您不应该简单地获取和修改项目子项的可变数组。