NSOutlineView parentForItem returns 父项折叠时为零

NSOutlineView parentForItem returns nil when parent is collapsed

我有一个 NSOutlineView,为此我写了 datasourcedelegate。当我将项目添加到组中并且组项目处于折叠状态时,parentForItem returns 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

如果 GroupItem 已折叠,此方法记录如下:

 newItemParent = (null)

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

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

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

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