【问题标题】:NSOutlineView parentForItem returns nil when parent is collapsedNSOutlineView parentForItem 在父项折叠时返回 nil
【发布时间】:2016-04-13 19:47:29
【问题描述】:

我有一个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);
}

如果 theGroupItem 已展开,此方法会记录以下内容:

newItemParent = TLItem: 0x60800004bbb0

如果 theGroupItem 已折叠,此方法会记录以下内容:

 newItemParent = (null)

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

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

【问题讨论】:

    标签: objective-c macos cocoa nsoutlineview


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢@Ken。我有点懒惰,不想将父引用添加到我的层次结构中。我仍然很好奇为什么当父级折叠时视图为零,但我会接受。
    • 当父级折叠时,子级不在大纲视图中。大纲视图只是忘记了它们,因为它知道它可以从数据源中再次检索它们。
    • 知道了。感谢您的解释。这对我的心理模型很有帮助。
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 2013-12-02
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多