首先我为篇幅道歉,但我想确保我得到足够的信息。我有一个有趣的问题,应该不难。我知道,如果您想让 NSOutlineView 滚动到并想要显示特定行,您只需使用以下模式:
NSInteger row = [self.myOutlineView rowForItem:myItem];
[self.myOutlineView scrollRowToVisible:row];
我没有使用 NSTreeController 来支持使用委托。
我正在使用适配器模式类来充当我的数据。适配器包装了许多不同的类型。这是一个简单的结构:
[适配器子] ----- *[适配器父]
因此适配器负责处理子项计数,可以添加、删除、扩展等,并且还充当数据传输对象。
因此,所有这些都解决了,这就是问题的症结所在。当我向 NSOutlineView 添加一个新项目时,我首先向大纲视图中选择的适配器添加一个新的子适配器。然后我使用以下方法重新加载项目:
[self.myOutlineView reloadItem:selectedAdapter reloadChildren:YES];
然后,我显示该对象的视图并尝试同步 NSOutlineView,以便所选行与新显示的视图相关。因此,以简单的方式,步骤是:
- 最初使用 NSOutlineDataSource 协议加载带有数据的 NSOutlineView
- 用户选择可以添加子项的项(适配器)
- 用户点击“添加”按钮
- 创建了一个新的空表示对象
- 新表示的对象包装在适配器中
- 新创建的适配器被添加到所选适配器的子项中
- 使用新表示的对象创建一个新视图并显示
- 选定的(父)节点及其子节点在 NSOutlineView 中重新加载
- NSOutlineView 中新创建的行滚动到视图同步视图和 NSOutlineView 的选择
所以这就是问题所在。如果使用 rowForItem 方法,NSOutlineView 将找不到新添加的项目。然而,在我重新加载后,我可以展开父节点并选择新添加的项目,一切正常。为了解决这个问题,我以编程方式扩展了父节点(暴露了新项目),然后尝试滚动到新项目,但它仍然找不到该行。rowForItem 返回 -1。
添加一个我没有在 NSOutlineView 中更新某些内容的新项目时,我是否错过了某些内容?我已经尝试了许多不同的事情但没有成功,任何帮助将不胜感激。
在此先感谢,罗布