【问题标题】:How can I get the element that was right-clicked in a context menu on a NSOutlineView?如何获取在 NSOutlineView 的上下文菜单中右键单击的元素?
【发布时间】:2013-04-16 08:54:23
【问题描述】:

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

现在我有两个问题。

  1. 如何识别右键单击的元素,以便对上下文菜单中的任何功能采取相应的行动。
  2. 如何在实际打开上下文菜单之前更改上下文菜单,以根据右键单击的元素删除或禁用菜单项?

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

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

    然后可以使用NSOutlineViewitemForRow 将行号转换为项目。

    对于菜单部分,NSMenuDelegate方法menu:updateItem:atIndex:shouldCancel:在菜单显示之前被调用,所以你可以根据需要进行修改。

    根据docs,你还得实现numberOfItemsInMenu:

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

    【讨论】:

    • 我添加了一个 并实现了 方法但没有调用该方法?!我错过了什么吗?
    • 有效。我有 FileOwner 的委托,这是我的主要 ViewController
    • 使用了自动补全“ESC”。我会忽略一个错字。
    【解决方案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时得到通知。

    【讨论】:

    • 整个 OS X 的默认行为是不自动选择通过鼠标右键单击的项目(上下文菜单)
    猜你喜欢
    • 2017-05-01
    • 2010-12-15
    • 2017-04-22
    • 1970-01-01
    • 2021-04-07
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多