【问题标题】:OS X storyboard: how to show a window programmatically?OS X 故事板:如何以编程方式显示窗口?
【发布时间】:2015-03-15 22:51:29
【问题描述】:

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

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

  • 应用启动时不可见,带有菜单栏项
  • 点击菜单栏项目显示主窗口
  • 停用时,窗口被隐藏

所以我试图在单击菜单项时以编程方式显示主窗口,但没有成功。

我的主窗口已选中“停用时隐藏”。隐藏后,我无法使用代码使其再次可见。

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

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

【问题讨论】:

    标签: macos cocoa swift uistoryboard


    【解决方案1】:

    这是您必须以编程方式显示 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 来存储您的窗口,如下所示

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

    【讨论】:

    • 我不需要创建新窗口。您的第二个示例重用了现有的可见窗口,对吗?
    • yes 第二个保存用IB创建的主窗口
    【解决方案2】:

    makeKeyAndOrderFront 方法是 NSWindow 方法,但 instantiateInitialController 返回的是窗口控制器,而不是它的窗口。

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

    最后,您可能还需要将应用程序放在最前面。致电 [NSApp activateIgnoringOtherApps:YES](或 Swift 等价物)。

    【讨论】:

    • 可以在窗口控制器上使用 showWindow(_:)
    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多