正在为状态栏打开一个 window OS X 10.10 应用程序

Opening a window for status bar OS X 10.10 application

我正在使用 Swift 1.2 和故事板开发状态栏 OS X 应用程序。

我的应用程序没有初始控制器,因为我不希望在应用程序启动时显示任何 windows。但是,如果应用程序尚未配置,我需要打开首选项 window。我该如何正确地做到这一点?现在我用 NSPopover 来做这件事,但这是一个丑陋的解决方案,并且没有提供良好的用户体验。

如果应用程序没有入口点、初始控制器,有没有办法打开 window 视图控制器?我有一种感觉,我的架构可能是错误的。谢谢。

import Cocoa

let kPreferences = "preferences"

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var statusMenu: NSMenu!

    let popover = NSPopover()
    var statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-2)

    func applicationDidFinishLaunching(aNotification: NSNotification) {

        syncronizeExcercises()

        // Status menu icon
        let button = statusItem.button
        button!.image = NSImage(named: "statusIcon")

        statusItem.menu = statusMenu

        let defaults = NSUserDefaults.standardUserDefaults()
        if let prefences = defaults.stringForKey(kPreferences) {
            println(prefences)
        } else {
            let preferencesViewController = NSStoryboard(name: "Main", bundle: nil)?.instantiateControllerWithIdentifier("PreferencesViewController") as! PreferencesViewController
            preferencesViewController.notConfigured = true

            popover.contentViewController = preferencesViewController
            popover.showRelativeToRect(button!.bounds, ofView: button!, preferredEdge: NSMinYEdge)
        }
    }

您始终可以手动加载 NSStoryboard 的实例(一些带有文件名的 init 方法)。然后您可以从该故事板中获取初始视图控制器并呈现它。你只需要在你的 sotryboard 编辑器中设置初始视图控制器,它应该像这样工作。

虽然这个问题我已经面对很久了,但是还是没有解决:我也想做这样一个应用,我用了我的方法,但是当你觉得要关闭的时候window 使用 CMD-Q 它实际上退出了应用程序(显然)

好吧,我最终创建了一个初始视图控制器,现在显示主要 window 以防应用程序已配置。

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var statusMenu: NSMenu!

    var window: NSWindow?
    let popover = NSPopover()
    var statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-2)

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        window = NSApplication.sharedApplication().windows.last! as? NSWindow
        window!.close()

        syncronizeExcercises()

        // Status menu icon
        let button = statusItem.button
        button!.image = NSImage(named: "statusIcon")

        statusItem.menu = statusMenu

        let defaults = NSUserDefaults.standardUserDefaults()
        if let prefences = defaults.stringForKey(kPreferences) {
            println(prefences)
        } else {
            let preferencesViewController = window?.contentViewController as! PreferencesViewController
            preferencesViewController.notConfigured = true

            window?.makeKeyAndOrderFront(nil)
        }
    }