【问题标题】:Modify NSMenu structure on each open?在每次打开时修改 NSMenu 结构?
【发布时间】:2011-03-13 22:22:17
【问题描述】:

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

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

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

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

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

有没有办法做到这一点?

【问题讨论】:

  • 我觉得你需要NSMenu.update()

标签: objective-c cocoa nsmenuitem nsmenu


【解决方案1】:

您可以继承 NSMenu 并覆盖 submenuAction:

或者您可以订阅NSMenuWillSendActionNotification

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-30
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 2015-03-15
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多