2010-11-24 67 views
0

首先,我对此长度表示歉意,但我想确保获得足够的信息。我有一个有趣的问题,应该不难。我知道,如果你想拥有NSOutlineView滚动并要显示一个特定的行只需要使用这个模式:赞成使用代表团获取NSOutlineView滚动到新条目

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

我没有使用NSTreeController。

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

[适配器的孩子] ----- * [适配器父]

因此适配器需要处理儿童数的护理,可以添加,可以删除,可以扩大等并且也充当数据传输对象。

因此,这里所有的一切都是问题的关键。当我添加一个新的项目到NSOutlineView我开始通过添加一个新的子适配器到在大纲视图中选择的适配器。然后我重装用儿童的项目:

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

我然后显示该对象的视图,并尝试将NSOutlineView同步,以便所选择的行涉及新显示的视图。因此,在一个简单的方法步骤是:

  1. 最初利用NSOutlineDataSource协议
  2. 用户选择,可以添加子项
  3. 用户点击一个项目(适配器)数据加载NSOutlineView“添加”按钮
  4. 新表示对象被包裹在一个适配器
  5. 新创建的适配器被添加到所选择的适配器
  6. 的孩子创建
  7. 一个新的空表示对象
  8. 一个新视图是使用新的表示对象创建并显示
  9. 所选(父)节点及其子节点在NSOutlineView
  10. 在NSOutlineView新创建的行被滚动以查看哪个同步视图和重新加载选择的NSOutlineView

所以这里是问题所在。如果使用rowForItem方法,NSOutlineView将不会找到新添加的项目。然而,我重新加载后,我可以展开父节点,并选择新添加的项目,一切正常。在试图解决这个问题时,我以编程方式扩展了父节点(公开新项目),然后尝试滚动到新项目,但仍无法找到该行。 rowForItem返回-1。

添加一个新的项目,我没有更新NSOutlineView中的东西时,我错过了什么吗?我尝试了许多不同的事情,但没有成功,任何帮助都将不胜感激。

由于提前, 罗布

回答

1

解决我自己的问题......最后。

因为我将第一个孩子添加到该节点,并且它从非展开状态变为展开状态,所以需要首先展开,然后滚动到查看,然后选择该项目。没有更多的问题。