如何获取在NSOutlineView上下文菜单中右键单击的元素?

时间:2013-04-16 08:54:24

标签: objective-c cocoa

我有NSOutlineView并且还创建了一个菜单,当我右键单击任何元素时,该菜单显示为上下文菜单。

现在我有两个问题。

  1. 如何识别右键单击的元素,以便相应地对上下文菜单中的任何功能执行操作。
  2. 在实际打开它以删除或禁用菜单项之前,如何更改上下文菜单,具体取决于右键单击的元素?

2 个答案:

答案 0 :(得分:1)

clickedRow方法(继承自NSTableView)会为您提供行号。

然后可以使用NSOutlineView的{​​{1}}将行号转换为项目。

对于菜单部分,在显示菜单之前调用itemForRow方法NSMenuDelegate,因此您可以根据需要进行修改。

根据docs,您还必须实施menu:updateItem:atIndex:shouldCancel:

您可以为大纲视图和菜单设置与委托相同的对象。

答案 1 :(得分: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时收到通知。