在每次打开时修改NSMenu结构?

时间:2011-03-13 22:22:18

标签: objective-c cocoa nsmenuitem nsmenu

我需要能够在每次显示时动态修改NSMenu层次结构(添加/删除项目等)。例如:

  1. 用户在主菜单上启动跟踪会话并选择子菜单
  2. 检测子菜单即将打开并运行代码进行修改
  3. 继续跟踪,用户再次追踪相同的子菜单:转到2
  4. 为此,我有一个实现 NSMenuDelegate 协议的对象。方法 menuNeedsUpdate 第一次工作(2),但第二次打开子菜单时不起作用。 (每个跟踪会话只调用一次)

    每次调用方法 menuWillOpen ,但是文档有以下警告,似乎使用此方法取消资格:

      

    不要修改结构   菜单或此期间的菜单项   方法

    有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:0)

您可以继承NSMenu并覆盖submenuAction:

或者您可以订阅NSMenuWillSendActionNotification

虽然听起来并不适合你,但仅供参考,NSMenuValidation是一个逐项更新菜单项的好地方。

答案 1 :(得分:0)

当您第一次跟踪子菜单时,

menuWillOpen将仅被调用一次。此时,您将填充菜单。

之后,不会再次调用menuWillOpen。但是,对菜单的任何更改都将实时进行。因此,当主要父菜单打开时,无论何时源数据发生更改(或者如果无法检测到更改,都会定期更新),请使用常规NSMenu API更新菜单。

确保在系统跟踪菜单时运行用于更新菜单的任何方法。