【问题标题】:Getting NSOutlineView to scroll to new entry让 NSOutlineView 滚动到新条目
【发布时间】:2010-11-24 19:20:26
【问题描述】:

首先我为篇幅过长而道歉,但我想确保我得到足够的信息。我有一个有趣的问题,应该不难。我知道,如果您想让 NSOutlineView 滚动到并显示特定行,您只需使用此模式:

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

我没有使用 NSTreeController 来支持使用委托。

我正在使用适配器模式类来充当我的数据。适配器包装了许多不同的类型。这是一个简单的结构:

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

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

因此,所有这些都解决了,这就是问题的症结所在。当我向 NSOutlineView 添加一个新项目时,我首先向大纲视图中选择的适配器添加一个新的子适配器。然后我使用以下方法重新加载项目:

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

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

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

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

在添加一个我没有在 NSOutlineView 中更新某些内容的新项目时,我是否遗漏了某些内容?我尝试了许多不同的方法但没有成功,我们将不胜感激。

提前致谢, 抢

【问题讨论】:

    标签: object insert find nsoutlineview


    【解决方案1】:

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

    由于我将我的第一个子节点添加到该节点并且它从不可扩展变为可扩展,因此需要先展开它,然后滚动查看,然后选择该项目。没问题了。

    【讨论】:

    • 您好,您可以通过示例代码回答您自己的问题,以帮助其他人
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多