0

首先我为篇幅道歉,但我想确保我得到足够的信息。我有一个有趣的问题,应该不难。我知道,如果您想让 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 中更新某些内容的新项目时,我是否错过了某些内容?我已经尝试了许多不同的事情但没有成功,任何帮助将不胜感激。

在此先感谢,罗布

4

1 回答 1

1

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

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

于 2010-11-25T04:55:50.510 回答