我正在使用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()时,没有任何反应。 (但我在日志中看到了一条记录) 我确定这里没有魔法,我只是做错了什么。 有人能帮我吗?提前谢谢。
答案 0 :(得分:5)
通常,Info.plist中包含LSUIElement
的应用程序将不是活动应用程序。用户无法使用Command-Tab或Dock切换到它,因为它不会出现在那里。
当非活动应用程序将窗口命令到前面时,它实际上不会在活动应用程序前面。这会窃取焦点并中断用户,这通常是不受欢迎的。相反,窗口最终位于前窗后面。
然而,对于菜单栏应用程序,您确实希望“窃取”焦点。用户刚刚请求了您的应用程序的一个窗口,因此希望您的应用程序变为活动状态。这是将{true}传递给activateIgnoringOtherApps()
NSApplication
方法的罕见情况之一。所以,你应该致电NSApplication.sharedApplication().activateIgnoringOtherApps(true)
。这将确保您的窗口实际上在最前面。