在OS X Swift应用程序中显示隐藏窗口

时间:2015-05-10 15:23:06

标签: macos swift xcode6

我正在使用Swift为OS X Yosemite开发一个简单的菜单栏应用程序。 我需要的是显示“首选项”窗口(当用户点击菜单项时) 窗口应该在启动时隐藏,并应在用户调用时显示。

我找到了一个实现我需要的同样的例子:http://www.johnmullins.co/blog/2014/08/08/menubar-app/

这是我的应用程序中的一段代码:

class AppDelegate: NSObject, NSApplicationDelegate {
    @IBOutlet weak var buildStatusMenu: NSMenu!
    @IBOutlet weak var preferencesWindow: NSWindow!

    let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-1)
    func applicationDidFinishLaunching(aNotification: NSNotification) {
        self.preferencesWindow!.orderOut(self)
    }  

    func showPreferencesWindow(sender: AnyObject?) {
        self.preferencesWindow!.orderFront(self)
        NSLog("Show window")
    }

orderOut工作正常,我在启动时看不到窗口但是当我尝试调用showPreferencesWindow()时,没有任何反应。 (但我在日志中看到了一条记录) 我确定这里没有魔法,我只是做错了什么。 有人能帮我吗?提前谢谢。

1 个答案:

答案 0 :(得分:5)

通常,Info.plist中包含LSUIElement的应用程序将不是活动应用程序。用户无法使用Command-Tab或Dock切换到它,因为它不会出现在那里。

当非活动应用程序将窗口命令到前面时,它实际上不会在活动应用程序前面。这会窃取焦点并中断用户,这通常是不受欢迎的。相反,窗口最终位于前窗后面。

然而,对于菜单栏应用程序,您确实希望“窃取”焦点。用户刚刚请求了您的应用程序的一个窗口,因此希望您的应用程序变为活动状态。这是将{true}传递给activateIgnoringOtherApps() NSApplication方法的罕见情况之一。所以,你应该致电NSApplication.sharedApplication().activateIgnoringOtherApps(true)。这将确保您的窗口实际上在最前面。