使用 Storyboard 覆盖 Swift 中的菜单



我正在用xCode编写一个Swift应用程序,并且没有问题创建一个新的菜单项并将其连接起来,以便发送的操作响应我的ViewController中的函数。 我遇到困难的地方是,如果我尝试覆盖现有的Apple预设菜单操作之一。例如,我想显示我自己的帮助,所以我想覆盖 showHelp: 函数,该函数当前是为帮助菜单设置的操作。

这就是我所做的。 请记住,我正在使用故事板,这适用于新菜单项。

  1. 已为主菜单.xib
  2. 添加了一个新的动作秀我的帮助:我把类型保留为 id
  3. 在我的视图控制器中创建一个名为showMyHelp()的新函数
  4. 从主菜单中选择 myApplicationName 帮助菜单项,然后从连接面板中选择,从"已发送操作"拖动到主菜单的第一个响应者,然后从选择列表中选择"showMyHelp"。 "已发送操作"现在读取"第一响应者/showMyHelp>操作:

但是,当我运行该应用程序时,帮助菜单现在已禁用,我无法访问它。

同样,如果我对我添加的自定义菜单项之一重复此方法,它可以正常工作。 菜单项未禁用,并执行操作。

好的。 我发现了我的问题所在。在上面的步骤 3 中,我需要包含发件人:AnyObject?作为调用函数时的参数,所以显示我的帮助(发件人:任何对象?

现在一切都很好。 下一步是弄清楚如何根据需要管理启用和禁用菜单项。

感谢您的帮助帖子。但是,我发现有一点可以使其工作:

  • 函数签名应以@IBAction开头
@IBAction func showMyHelp(_ sender: AnyObject?)
  • 此功能应在您的AppDelegate中定义。

对于下一步,请按照前面的步骤操作,它可以工作! :)

您也可以在 ViewController 上实现。
但是,首先,您指示接受第一响应者的标志。

import Cocoa
class ViewController: NSViewController {
  // ..
  override var acceptsFirstResponder: Bool {
    return true
  }
  @IBAction func showHelp(_ sender: Any) {
    print("showHelp")
  }

最新更新