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

Menu access from NSStatusItem (Menu Bar) Application in Swift

我正在创建一个应用程序,其中菜单栏似乎是无需 window 即可清洁用户桌面的最便捷方式。我在网上和 stack overflow 上看过很多教程,但它们似乎只适用于 Objective-C。我只使用 Swift。如果您不知道菜单栏是什么,它们就是这些图标:

我希望我的应用程序具有其中之一,而不是常量的完整 window。如果可以的话,我怎样才能在我的菜单栏上有一个按钮来调出 window。最后,我怎么能不显示我的图标,但我仍然有取景器的优势。 (如文件、编辑...)。例如,

我已经试过了

Application is Agent (UIElement) to False

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

您的意思大概是您希望“编辑”菜单中的文本编辑项(如撤消、剪切、复制、粘贴,Select 全部)在您应用的 window 中工作.

那些菜单项是另一个应用程序的一部分,并且只在该应用程序中发送消息。它们对您的应用程序不可用,无论它是否是“代理”(没有自己的可见菜单栏)。如果您的一个代理应用程序 windows 是键 window 并且用户单击属于另一个应用程序的菜单标题(如文件或编辑),则该应用程序将激活并且您的应用程序的 window 将“放弃”密钥 window 状态。

可以使常用快捷键(如 ⌘X 用于 Cut)适用于您的应用程序,而且很容易。当您的应用程序的其中一个 windows 是用户的键 window 时,您的应用程序会收到键盘事件,并且 您的 NSApplication object(自动为您创建)将检查其 mainMenu 的键盘快捷键,即使主菜单未显示在屏幕上

OS X “Cocoa Application”项目模板在MainMenu.xib(或Main.storyboard)中为您设置了一个主菜单栏,其中包含所有连接到适当操作的菜单项。因此,如果您保留主菜单栏和“编辑”菜单以及“编辑”菜单中的菜单项,并保留在这些项目上设置的快捷方式,那么即使您将 LSUIElement 设置为 YES,键盘快捷方式也会起作用在您的 Info.plist 中,当您的应用程序之一 windows 是密钥 window 时。换句话说,快捷键将默认工作,您必须更改一些东西才能使它们停止工作。

您应用的 windows 中的文本字段仍将获得默认的 right-click 菜单,其中包含剪切、复制和粘贴等常用项目,因此您无需执行任何其他操作让那个工作。

这是我的测试应用程序 MainMenu.xib 的内容:

我单独留下了主菜单栏。我创建了一个包含两个项目的单独菜单,“Show Window”和“Quit”。我已经将“退出”的快捷方式设置为⌘Q,但是这个快捷方式没有效果。主菜单栏的 StatusItem > Quit 菜单项(在我的屏幕截图中不可见)具有相同的快捷方式集,这就是重要的设置。我在另一个退出项上设置了快捷方式,因为它对用户可见,而主菜单栏对用户不可见。

我已将此 Quit 项目连接到 First Responder 的 terminate: 操作。 (StatusItem > Quit 菜单项默认连接方式相同。)

这是我的 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)
    }

}

我已将“Show Window”菜单项连接到 showWindow(_:) 操作,并将 statusItemMenu 插座连接到 XIB 中的独立菜单。

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

当我 运行 这个应用程序时,它会在菜单栏中创建状态项。我可以从项目中选择“Show Window”,然后我的 window 就会出现在前面并成为关键。我可以 right-click 文本字段来获取其上下文菜单。我可以使用 cut/copy/paste/etc 的标准快捷方式,关闭 window,甚至退出应用程序。