使用 Storyboard 覆盖 Swift 中的菜单

Posted

技术标签:

【中文标题】使用 Storyboard 覆盖 Swift 中的菜单【英文标题】:Overriding Menus in Swift with Storyboard 【发布时间】:2016-03-08 22:40:10 【问题描述】:

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

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

    为第一个响应者选择了属性检查器 MainMenu.xib 添加了一个新操作 showMyHelp:,我将类型保留为 id 在我的 ViewController 中创建了一个名为 showMyHelp() 的新函数 从主菜单中选择 myApplicationName help 菜单项,然后从 connections 面板中,从 Sent Actions 拖到 first MainMenu 的响应者 并从选择列表中选择 showMyHelp。 Sent Actions 现在显示为 action > First Responder / showMyHelp:

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

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

【问题讨论】:

【参考方案1】:

好的。我发现我的问题是什么。 在上面的第 3 步中,我需要包含发件人:AnyObject?作为调用函数时的参数,所以 showMyHelp(sender: AnyObject?)

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

【讨论】:

对于未来的读者,我必须将其设为 someFunc(_ sender: AnyObject?) 才能使菜单项不灰显【参考方案2】:

感谢您的有用帖子。但是,我发现了一些让它起作用的小东西:

函数签名应该以@IBAction开头
@IBAction func showMyHelp(_ sender: AnyObject?)
这个函数应该在你的AppDelegate中定义。

接下来,按照前面的步骤操作即可! :)

【讨论】:

【参考方案3】:

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

import Cocoa

class ViewController: NSViewController 
  // ..
  override var acceptsFirstResponder: Bool 
    return true
  

  @IBAction func showHelp(_ sender: Any) 
    print("showHelp")
  

【讨论】:

以上是关于使用 Storyboard 覆盖 Swift 中的菜单的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ViewController.swift 连接到 Storyboard 中的 ViewController?

是否可以以编程方式从 Swift/Objective-C 中的 UIViewController 或 Storyboard 中获取基本 UIViewController 的标识符?

swift项目第五天:swift中storyBoard Reference搭建主界面

iOS/Swift/Storyboard:仅使用屏幕的 *part* 添加 PageViewController?

iOS 给Main.storyboard 添加button 事件《转》

swift 创建一个新的viewController文件并使用storyboard附加swift文件