打开状态栏OS X 10.10应用程序的窗口

时间:2015-07-01 16:22:00

标签: macos swift osx-yosemite statusbar xcode-storyboard

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

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

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

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)
        }
    }

2 个答案:

答案 0 :(得分:2)

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

Storyboard

@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)
        }
    }

答案 1 :(得分:1)

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

虽然我遇到了这个问题很长一段时间但仍然没有解决方案:我也想创建这样的应用程序,我使用了我的方法,但当你认为你想用CMD关闭窗口时问:它实际上退出了应用程序(显然)