OS X 故事板:如何以编程方式显示 window?

OS X storyboard: how to show a window programmatically?

我正在创建一个 OS X 状态栏应用程序。

我正在努力实现以下目标:

因此,我尝试在单击菜单项时以编程方式显示主 window,但没有成功。

我的主要 window 已检查 "Hide on deactivate"。隐藏后,我无法使用代码使其再次可见。

这是我目前拥有的代码,但它不起作用:

@IBAction func menuClick(sender: AnyObject) {
    var mainWindow = NSStoryboard(name: "Main", bundle: nil)?.instantiateInitialController()
    mainWindow?.makeKeyAndOrderFront(self)
}

makeKeyAndOrderFront 方法是 NSWindow 方法,但是 instantiateInitialController returns window 控制器,而不是它的 window。

此外,如果 window 在停用时隐藏,您将不想实例化另一个副本。保留对 window 的引用并重新显示。

最后,您可能还需要将应用程序置于最前面。调用 [NSApp activateIgnoringOtherApps:YES](或等效的 Swift)。

这是以编程方式显示 Windows 的方法:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

     let mainWindow = NSWindow(contentRect: NSMakeRect(0, 0, NSScreen.mainScreen()!.frame.width/2, NSScreen.mainScreen()!.frame.height/2), styleMask: NSTitledWindowMask|NSResizableWindowMask|NSMiniaturizableWindowMask|NSClosableWindowMask, backing: NSBackingStoreType.Buffered, defer: false)

    func createNewWindow(){
        mainWindow.title = "Main Window"
        mainWindow.opaque = false
        mainWindow.center()
        mainWindow.hidesOnDeactivate = true
        mainWindow.movableByWindowBackground = true
        mainWindow.backgroundColor = NSColor(calibratedHue: 0, saturation: 0, brightness: 1, alpha: 1)
        mainWindow.makeKeyAndOrderFront(nil)
    }
    func applicationDidFinishLaunching(aNotification: NSNotification) {
        // lets get rid of the main window just closing it as soon as the app launches
        NSApplication.sharedApplication().windows.first!.close()
    }
    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }
    @IBAction func menuClick(sender: AnyObject) {
        createNewWindow()
    }
}

或者您可以创建一个可选的 NSWindow var 来存储您的 window,然后按如下所示关闭它

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    var defaultWindow:NSWindow?
    func applicationDidFinishLaunching(aNotification: NSNotification) {
        // lets get rid of the main window just closing it as soon as the app launches
        defaultWindow = NSApplication.sharedApplication().windows.first as? NSWindow
        if let defaultWindow = defaultWindow {
            defaultWindow.close()
        }
    }
    func applicationWillTerminate(aNotification: NSNotification) {
        // Insert code here to tear down your application
    }
    @IBAction func menuClick(sender: AnyObject) {
        if let defaultWindow = defaultWindow {
            defaultWindow.makeKeyAndOrderFront(nil)
        }
    }
}