从 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,甚至退出应用程序。
我正在创建一个应用程序,其中菜单栏似乎是无需 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,甚至退出应用程序。