首先,我对此长度表示歉意,但我想确保获得足够的信息。我有一个有趣的问题,应该不难。我知道,如果你想拥有NSOutlineView滚动并要显示一个特定的行只需要使用这个模式:赞成使用代表团获取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中的东西时,我错过了什么吗?我尝试了许多不同的事情,但没有成功,任何帮助都将不胜感激。
由于提前, 罗布