9

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

  1. 用户在主菜单上启动跟踪会话并选择子菜单
  2. 检测子菜单即将打开并运行代码来修改它
  3. 继续跟踪,用户再次在同一个子菜单上跟踪:转到 2

所以要做到这一点,我有一个实现NSMenuDelegate协议的对象。menuNeedsUpdate方法第一次起作用 (2),但在第二次打开子菜单时不起作用。(每个跟踪会话仅调用一次)

方法menuWillOpen每次都会被调用,但是有文档有以下警告,这似乎取消了使用这种方法的资格:

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

有没有办法做到这一点?

4

2 回答 2

0

您可以继承 NSMenu 并覆盖submenuAction:

或者你可以订阅NSMenuWillSendActionNotification

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

于 2011-03-17T04:04:55.000 回答
0

menuWillOpen 只会被调用一次,这是您第一次跟踪子菜单时。此时,您填充菜单。

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

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

于 2012-10-18T09:40:57.607 回答