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

使NSOutlineView滚动到新条目

  •  0
  • Rob  · 技术社区  · 15 年前

    首先,我很抱歉篇幅太长,但我想确保我能得到足够的信息。我有一个很有趣的问题,其实并不难。我知道,如果要让NSOutlineView滚动到并显示特定行,只需使用以下模式:

    NSInteger row = [self.myOutlineView rowForItem:myItem];
    [self.myOutlineView scrollRowToVisible:row];
    

    我使用的不是支持委托的NSTreeController。

    我使用适配器模式类作为我的数据。适配器包装了许多不同的类型。它是一个简单的结构:

    [适配器子项]----*[适配器父项]

    因此适配器负责处理子计数、可以添加、可以删除、可以扩展等,并且还充当数据传输对象。

    所以所有这些都是问题的症结所在。当我向NSOutlineView添加新项时,首先向outline视图中选择的适配器添加新的子适配器。然后,我使用以下命令重新加载子项:

    [self.myOutlineView reloadItem:selectedAdapter reloadChildren:YES];
    

    然后显示该对象的视图,并尝试同步NSOutlineView,使所选行与新显示的视图相关。简单地说,步骤是:

    1. 最初使用NSOutlineDataSource协议用数据加载NSOutlineView
    2. 用户选择可以添加子项的项(适配器)
    3. 用户点击“添加”按钮
    4. 创建一个新的空表示对象
    5. 新表示的对象包装在适配器中
    6. 新创建的适配器将添加到选定适配器的子级
    7. 使用新表示的对象创建新视图并显示
    8. 选定(父)节点及其子节点将在NSOutlineView中重新加载
    9. 在NSOutlineView中新创建的行被滚动到view,从而同步视图和NSOutlineView的选择

    这就是问题所在。如果使用rowForItem方法,NSOutlineView将找不到新添加的项。不过,在我重新加载之后,我可以展开父节点并选择新添加的项,一切正常。为了解决这个问题,我以编程方式展开父节点(公开新项),然后尝试滚动到新项,但它仍然找不到行。rowForItem返回-1。

    添加新项目时是否遗漏了一些内容,而我没有在NSOutlineView中更新这些内容?我尝试过很多不同的事情,但都没有成功,任何帮助都会非常感谢。

    提前谢谢你, 抢劫

    1 回复  |  直到 15 年前
        1
  •  1
  •   Rob    15 年前

    终于解决了我自己的问题。

    由于我正在将第一个子节点添加到该节点,并且它正在从不可扩展更改为可扩展,因此需要先展开它,然后滚动到“视图”,然后选择该项。没问题了。