Cocoa Xcode:使用 Swift 4 for Mac 以编程方式从 AppDelegate 打开窗口控制器?

Posted

技术标签:

【中文标题】Cocoa Xcode:使用 Swift 4 for Mac 以编程方式从 AppDelegate 打开窗口控制器?【英文标题】:Cocoa Xcode: Open Window Controller from AppDelegate Programmatically using Swift 4 for Mac? 【发布时间】:2018-08-28 07:42:19 【问题描述】:

我正在制作一个简单的菜单栏应用程序,它有 2 个项目 - PreferencesQuit

我想在点击Preferences

时打开一个新窗口

目前我有

func applicationDidFinishLaunching(_ aNotification: Notification) 
        constructMenu()
    

func constructMenu() 
        let menu = NSMenu()

        menu.addItem(NSMenuItem(
                       title: "Preferences...", 
                       action: #selector(AppDelegate.preferencesWindow(_:)), 
                       keyEquivalent: "P"))
        menu.addItem(NSMenuItem.separator())
        menu.addItem(NSMenuItem(
                       title: "Quit", 
                       action: #selector(NSApplication.terminate(_:)), 
                       keyEquivalent: "q"))

        statusItem.menu = menu
    

@objc func preferencesWindow(_ sender: Any) 
        print("open preference window here")
        if let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil) 
            let controller = storyboard.instantiateControllerWithIdentifier("preferencesWindow")
 as NSViewController

            if let window = NSApplication.shared.mainWindow 
                window.contentViewController = controller // just swap
            
        
    

但它会在这一行引发错误

if let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)

陈述

条件绑定的初始化器必须是 Optional 类型,而不是 'NSStoryboard'

当我单击 Preferences 时,print 语句会被记录,但我不知道如何以编程方式打开 Window。

我刚刚从 Object Library 中拖出 Window Controller 并给 StoryBoard ID 一个 preferencesWindow 值 p>

由于上述错误,我也尝试了以下方法

@objc func preferencesWindow(_ sender: Any) 
        print("open preference window here")
        let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)
        let controller = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "preferencesWindow")) as! NSViewController

        if let window = NSApplication.shared.mainWindow 
            window.contentViewController = controller // just swap
        
    

但它只记录并且从不打开窗口。我该怎么办?

【问题讨论】:

【参考方案1】:

当我在 SO 上发布问题时,我会很快找到答案。这对我有用

@objc func preferencesWindow(_ sender: Any) 
        var myWindow: NSWindow? = nil
        let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Main"),bundle: nil)
        let controller = storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "preferencesWindow")) as! NSViewController
        myWindow = NSWindow(contentViewController: controller)
        NSApp.activate(ignoringOtherApps: true)
        myWindow?.makeKeyAndOrderFront(self)
        let vc = NSWindowController(window: myWindow)
        vc.showWindow(self)
    

【讨论】:

以上是关于Cocoa Xcode:使用 Swift 4 for Mac 以编程方式从 AppDelegate 打开窗口控制器?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode6 中的 Swift 类与 Cocoa Touch 类

在没有 Xcode 的情况下制作 Cocoa App,例如:使用 VIM 进行编辑和 Swift 编译器

如何使用 Cocoa (Mac) 在 Swift 中创建 PDF

如何使用 Storyboards/Cocoa 在 Swift 3.x 中引用视图的窗口

构建纯 Swift Cocoa Touch 框架

Cocoa xcode 4.3 全局变量