我有一个NSOutlineView
我写了datasource
和delegate
。当我向组中添加项目并且组项目处于折叠状态时,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)
如何获取新添加项目的父级?
注意:我意识到这是一个愚蠢的例子,但在我的实际代码中,我需要能够走到树上找到层次结构中的所有父母。
答案 0 :(得分:4)
鉴于您已编写数据源,请使用该数据源而不是大纲视图来导航层次结构。数据源是模型的权限。大纲视图只是展示该模型某些部分的一种方式。在一般情况下,大纲视图不会完整地表示模型,并且通常需要查阅数据源来回答此类查询。所以,跳过中间人并直接前往源头。
如有必要,您的项目类应具有对其父项的弱引用。层次结构上的所有操作(添加子节点,删除子节点,将项目从一个父节点移动到另一个父节点等)应该通过数据源上的专用方法来保持父节点引用的更新。除了这些特定于层次结构操作的方法之外,您不应该简单地获取和修改项目子项的可变数组。