2013-04-16 65 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