让NSOutlineView滚动到新条目

时间:2010-11-24 19:20:27

标签: object insert find nsoutlineview

首先,我为长度道歉,但我想确保获得足够的信息。我有一个有趣的问题,真的不应该是困难的。我知道如果你想让NSOutlineView滚动到并希望显示一个特定的行,你只需使用这种模式:

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

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

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

[adapter children] ----- * [adapter parent]

因此适配器负责处理子计数,可以添加,可以删除,可以扩展等,也可以像数据传输对象一样。

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

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

然后我显示该对象的视图并尝试同步NSOutlineView,以便所选行与新显示的视图相关。因此,步骤如下:

  1. 最初使用NSOutlineDataSource协议
  2. 加载带有数据的NSOutlineView
  3. 用户选择可添加子项目的项目(适配器)
  4. 用户点击“添加”按钮
  5. 创建一个新的空表示对象
  6. 新表示的对象包含在适配器
  7. 新创建的适配器已添加到所选适配器的子项
  8. 使用新显示的对象创建新视图并显示
  9. 在NSOutlineView
  10. 中重新加载所选(父)节点及其子节点
  11. 滚动NSOutlineView中新创建的行以查看同步视图和NSOutlineView的选择
  12. 所以这就是问题所在。如果使用rowForItem方法,NSOutlineView将找不到新添加的项。然而,在我重新加载后,我可以扩展父节点并选择新添加的项目,一切正常。为了解决问题我尝试以编程方式扩展父节点(公开新项目),然后尝试滚动到新项目,但仍然无法找到该行。 rowForItem返回-1。

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

    提前致谢, 罗布

1 个答案:

答案 0 :(得分:1)

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

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