Xcode 从Swift中的NSStatusItem(菜单栏)应用程序访问菜单
我正在创建一个应用程序,其中菜单栏似乎是在没有窗口的情况下清理用户桌面的最方便方式。我在网上和stack overflow上看过很多教程,但它们似乎只针对Objective-C。我只使用Swift。如果您不知道菜单栏是什么,它们是以下图标: 我希望我的应用程序有一个这样的窗口,而不是一个恒定的完整窗口。如果可以,我怎么能在菜单栏上有一个打开窗口的按钮呢。最后,我怎么能让我的图标不显示,但我仍然有finder的优势。(如文件、编辑…)。比如说, 我已经试过了Xcode 从Swift中的NSStatusItem(菜单栏)应用程序访问菜单,xcode,swift,macos,menubar,Xcode,Swift,Macos,Menubar,我正在创建一个应用程序,其中菜单栏似乎是在没有窗口的情况下清理用户桌面的最方便方式。我在网上和stack overflow上看过很多教程,但它们似乎只针对Objective-C。我只使用Swift。如果您不知道菜单栏是什么,它们是以下图标: 我希望我的应用程序有一个这样的窗口,而不是一个恒定的完整窗口。如果可以,我怎么能在菜单栏上有一个打开窗口的按钮呢。最后,我怎么能让我的图标不显示,但我仍然有finder的优势。(如文件、编辑…)。比如说, 我已经试过了 Application is Ag
Application is Agent (UIElement) to False
在my Info.plist中,但这也剥夺了我的finder优势。您可能想说的是,您希望编辑菜单中的文本编辑项(如撤消、剪切、复制、粘贴、全选)在应用程序窗口中工作 这些菜单项是另一个应用程序的一部分,仅在该应用程序中发送消息。无论您的应用程序是否是“代理”(没有自己可见的菜单栏),它们都不可用。如果代理应用程序的一个窗口是关键窗口,并且用户单击属于另一个应用程序的菜单标题(如文件或编辑),则该应用程序将激活,并且应用程序的窗口将“退出”关键窗口状态 您可以制作常用的快捷键(如⌘X代表切割)适用于你的应用程序,而且很简单。当应用程序的一个窗口是用户的按键窗口时,应用程序接收键盘事件,您的
n应用程序
对象(自动创建)将检查其主菜单
中的键盘快捷键,即使主菜单未显示在屏幕上
OS X“Cocoa应用程序”项目模板在main menu.xib
(或main.storyboard
)中为您设置一个主菜单栏,所有菜单项都连接到相应的操作。因此,如果您保留主菜单栏、编辑菜单以及编辑菜单中的菜单项,并保留这些项上设置的快捷键,那么即使您在Info.plist
中将LSUIElement
设置为YES
,当您的应用程序的一个窗口是键窗口时,键盘快捷键也会起作用。换句话说,默认情况下快捷键会工作,您必须更改某些内容才能使其停止工作
应用程序窗口中的文本字段仍将获得默认的右键单击菜单,其中包含剪切、复制和粘贴等常用项,因此您也无需执行任何其他操作
以下是我的测试应用程序的主菜单的内容。xib
:
我把主菜单栏留着了。我创建了一个单独的菜单,其中有两个项目,“显示窗口”和“退出”。我已将“退出”的快捷方式设置为⌘Q、 但是这个快捷方式没有任何效果。主菜单栏上的StatusItem>Quit菜单项(在我的屏幕截图中不可见)设置了相同的快捷方式,这就是重要的设置。我在另一个退出项上设置了快捷方式,因为它对用户可见,而主菜单栏对用户不可见
我已将此退出项目连接到第一响应者的终止:
操作。(默认情况下,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
中将“应用程序是代理(UIElement)”设置为“是”
当我运行此应用程序时,它会在菜单栏中创建状态项。我可以选择“显示窗口”从项目和我的窗口来到前面,成为关键。我可以右键单击文本字段以获取其关联菜单。我可以使用标准快捷方式进行剪切/复制/粘贴等操作,关闭窗口,甚至退出应用程序。“我在网上和堆栈溢出上看到过很多教程,但它们似乎只适用于Objective-C。我只使用Swift”那又怎样?这与语言无关。使用你找到的教程。“Finder Advantage”是什么意思?@Matt我不理解这些教程,因为它们的语言完全不同。如果我想做一个有用的应用程序,我就不能编写一些我不懂的代码。@rob mayoff正在编辑。我仍然不明白“Finder Advantage”是什么意思。您已经添加了Safari菜单栏的图片。Safari不是Finder,菜单栏也不是“优点”。谢谢!我的应用程序没有Main menu.xib文件,但它位于Main.Storyboard中。有没有一种方法我可以转移它,因为我希望我的工作更干净。还有,我怎样才能用图像替换“Hello”?再次,谢谢,谢谢,谢谢!退房