Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode 从Swift中的NSStatusItem(菜单栏)应用程序访问菜单_Xcode_Swift_Macos_Menubar - Fatal编程技术网

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

Xcode 从Swift中的NSStatusItem(菜单栏)应用程序访问菜单,xcode,swift,macos,menubar,Xcode,Swift,Macos,Menubar,我正在创建一个应用程序,其中菜单栏似乎是在没有窗口的情况下清理用户桌面的最方便方式。我在网上和stack overflow上看过很多教程,但它们似乎只针对Objective-C。我只使用Swift。如果您不知道菜单栏是什么,它们是以下图标: 我希望我的应用程序有一个这样的窗口,而不是一个恒定的完整窗口。如果可以,我怎么能在菜单栏上有一个打开窗口的按钮呢。最后,我怎么能让我的图标不显示,但我仍然有finder的优势。(如文件、编辑…)。比如说, 我已经试过了 Application is Ag

我正在创建一个应用程序,其中菜单栏似乎是在没有窗口的情况下清理用户桌面的最方便方式。我在网上和stack overflow上看过很多教程,但它们似乎只针对Objective-C。我只使用Swift。如果您不知道菜单栏是什么,它们是以下图标:

我希望我的应用程序有一个这样的窗口,而不是一个恒定的完整窗口。如果可以,我怎么能在菜单栏上有一个打开窗口的按钮呢。最后,我怎么能让我的图标不显示,但我仍然有finder的优势。(如文件、编辑…)。比如说,

我已经试过了

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”?再次,谢谢,谢谢,谢谢!退房