使用 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?