我有一個NSOutlineView
,也創建了一個菜單,當我右鍵單擊任何元素時顯示爲上下文菜單。如何獲取在NSOutlineView的右鍵菜單中右鍵單擊的元素?
現在我有2個問題。
- 如何識別右鍵單擊的元素,以便在上下文菜單中的任何函數上相應地執行操作。
- 在我實際打開它以刪除或禁用菜單項(取決於右鍵單擊的元素)之前,我如何更改上下文菜單?
我有一個NSOutlineView
,也創建了一個菜單,當我右鍵單擊任何元素時顯示爲上下文菜單。如何獲取在NSOutlineView的右鍵菜單中右鍵單擊的元素?
現在我有2個問題。
理論上,右鍵單擊某行時,它應該已經是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時都會收到通知。
clickedRow
方法(繼承自NSTableView
)會給你行號。
然後可以使用NSOutlineView
的itemForRow
將行號轉換爲該項目。
對於菜單部分,在顯示菜單之前調用NSMenuDelegate
方法menu:updateItem:atIndex:shouldCancel:
,因此您可以根據需要對其進行修改。根據docs,您還必須執行numberOfItemsInMenu:
。
您可以爲大綱視圖和菜單設置與委託相同的對象。
整個OS X的默認行爲是不自動選擇被右擊單擊的項目(上下文菜單) – Jay