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