从Swift中的NSStatusItem(菜单栏)应用程序访问菜单

时间:2016-01-17 16:23:55

标签: xcode swift macos menubar

我正在创建一个应用程序,其中菜单栏似乎是在没有窗口的情况下让用户桌面清洁的最便捷方式。我已经在网上和堆栈溢出看过很多教程,但它们似乎只适用于Objective-C。我只使用Swift。如果您不知道菜单栏是什么,它们就是这些图标:

enter image description here

我希望我的应用程序能够使用其中一个而不是一个恒定的完整窗口。如果可以,我怎么能在我的菜单栏上设置一个按钮来调出窗口。最后,我怎么能没有显示我的图标,但我仍然有查找器优势。 (比如File,Edit ..)。例如,

enter image description here

我已经尝试过了

Application is Agent (UIElement) to False

在我的Info.plist中,但这也剥夺了我的查找器优势。

1 个答案:

答案 0 :(得分:5)

大概你所说的是你想要编辑菜单中的文本编辑项目(如撤消,剪切,复制,粘贴,全选)在你的应用程序窗口中工作。

这些菜单项是另一个应用程序的一部分,只在该应用程序中发送消息。它们不适用于您的应用程序,无论它是否为“代理”(没有自己的可见菜单栏)。如果您的代理商应用程序的某个窗口是关键窗口,并且用户单击属于另一个应用程序的菜单标题(如文件或编辑),则该应用程序将激活,您的应用程序窗口将“辞去“关键窗口状态。

可以为您的应用制作通常的快捷键(例如⌘X for Cut),这很简单。当您的某个应用程序窗口是用户的关键窗口时,您的应用会收到键盘事件,并且您的NSApplication对象(自动为您创建)将检查其{{1} }即使主屏幕没有显示在屏幕上,也可以显示键盘快捷键

OS X“Cocoa Application”项目模板在mainMenu(或MainMenu.xib)中为您设置主菜单栏,所有菜单项都连接到相应的操作。因此,如果您保留主菜单栏和编辑菜单以及编辑菜单中的菜单项并在这些项目上保留快捷方式,那么即使您将Main.storyboard设置为LSUIElement,键盘快捷方式仍然有效在您的YES中,当您的应用程序的某个窗口是关键窗口时。换句话说,默认情况下快捷键将起作用,您必须更改它们才能使它们停止工作。

应用程序窗口中的文本字段仍然会获得默认的右键单击菜单,其中包含剪切,复制和粘贴等常用项目,因此您无需执行任何其他操作即可工作要么。

以下是我的测试应用Info.plist的内容:

MainMenu.xib

我单独离开了主菜单栏。我创建了一个单独的菜单,其中包含两个项目“Show Window”和“Quit”。我已将“退出”的快捷方式设置为⌘Q,但此快捷方式无效。 StatusItem>退出主菜单栏上的退出菜单项(在我的屏幕截图中不可见)具有相同的快捷键设置,这是重要的设置。我已经在其他Quit项目上设置了快捷方式,因为它对用户可见,并且主菜单栏不会对用户可见。

我已将此退出项目连接到First Responder的MainMenu.xib操作。 (默认情况下,StatusItem>退出菜单项以相同的方式连接。)

这是我的terminate:

AppDelegate

我已将“显示窗口”菜单项连接到@NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet var window: NSWindow! @IBOutlet var statusItemMenu: NSMenu! var statusItem: NSStatusItem? func applicationDidFinishLaunching(aNotification: NSNotification) { self.statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(NSVariableStatusItemLength) let statusItem = self.statusItem! let button = statusItem.button! button.title = "Hello" statusItem.menu = statusItemMenu } @IBAction func showWindow(sender: AnyObject) { NSApp.activateIgnoringOtherApps(true) window.makeKeyAndOrderFront(sender) } } 操作,并且我已将showWindow(_:)插座连接到XIB中的独立菜单。

我还在statusItemMenu中将“Application is Agent(UIElement)”设置为“YES”。

当我运行此应用程序时,它会在菜单栏中创建状态项。我可以从项目中选择“显示窗口”,然后我的窗口出现在前面,成为关键。我可以右键单击文本字段以获取其上下文菜单。我可以使用标准快捷方式来剪切/复制/粘贴/等,关闭窗口,甚至退出应用程序。