2010-11-24 62 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

解決我自己的問題......最後。

因爲我將第一個孩子添加到該節點,並且它從非展開狀態變爲展開狀態,所以需要首先展開,然後滾動到查看,然後選擇該項目。沒有更多的問題。