2013-04-16 135 views
1

我有一個NSOutlineView,也創建了一個菜單,當我右鍵單擊任何元素時顯示爲上下文菜單。如何獲取在NSOutlineView的右鍵菜單中右鍵單擊的元素?

現在我有2個問題。

  1. 如何識別右鍵單擊的元素,以便在上下文菜單中的任何函數上相應地執行操作。
  2. 在我實際打開它以刪除或禁用菜單項(取決於右鍵單擊的元素)之前,我如何更改上下文菜單?

回答

0

理論上,右鍵單擊某行時,它應該已經是NSOutlineView中的選定行。無論如何,這不會正常發生。

我已經解決了這一點,通過實施以下方法(也回答了第二個問題):

- (void)menuNeedsUpdate:(NSMenu *)menu 

插入這個方法在你的類之一併註冊類作爲菜單委託(請注意:NSMenu,而不是單個NSMenuItem)。在上面的代碼中,我添加了這段代碼,在右鍵單擊時自動選擇點擊行。

if ([[arrayController selectedObjects] count] == 0 || [[arrayController selectedObjects] count] == 1) { 
     if ([myTable clickedRow] != -1) { 
      [myTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[myTable clickedRow]] byExtendingSelection:FALSE]; 
     } 
    } 

據我所知,這正常工作一個NSTableView裏面,所以它應該在你的NSOutlineView也行。

關於第二個問題,您可以使用上述方法在每次顯示NSMenu時都會收到通知。

+0

整個OS X的默認行爲是不自動選擇被右擊單擊的項目(上下文菜單) – Jay

1

clickedRow方法(繼承自NSTableView)會給你行號。

然後可以使用NSOutlineViewitemForRow將行號轉換爲該項目。

對於菜單部分,在顯示菜單之前調用NSMenuDelegate方法menu:updateItem:atIndex:shouldCancel:,因此您可以根據需要對其進行修改。根據docs,您還必須執行numberOfItemsInMenu:

您可以爲大綱視圖和菜單設置與委託相同的對象。

+0

我添加了一個並實現了方法,但是該方法不叫?!我錯過了什麼嗎? – eemceebee

+0

有效。我有代理FileOwner,這是我的主要ViewController – eemceebee

+0

使用自動完成「ESC」。我會解僱一個錯字。 – eemceebee