Cocoa:根据来自 App Delegate 的输入加载不同的视图控制器

Posted

技术标签:

【中文标题】Cocoa:根据来自 App Delegate 的输入加载不同的视图控制器【英文标题】:Cocoa: Load Different View Controllers depending on input from App Delegate 【发布时间】:2016-04-04 13:02:58 【问题描述】:

我正在尝试通过 AppDelegate 触发 2 个不同流中的 1 个,但似乎很挣扎。

如下图所示:

如果只有一个可以绑定到主 NSWindow 控制器,我如何实例化这两个不同的视图控制器?

我设法使用以下代码使用“addChildWindow”触发它们 - 但是我无法继续使用任何后续视图控制器。

这是我用来实例化视图控制器的代码:

   if let pboardString = pboard.stringForType(NSStringPboardType)
            print(pboardString)
           let storyboard = NSStoryboard(name: "Main", bundle: nil)
            let destcontroller  =  storyboard.instantiateControllerWithIdentifier("pickProject") as! WizardTextFromPasteboardVC
            destcontroller.weburlFromPaste = pboardString

            let numWindows = NSApplication.sharedApplication().windows
            if let window = NSApplication.sharedApplication().mainWindow 
                if numWindows.count >= 1
                    let childWindow = NSWindow(contentViewController: destcontroller)
                    window.addChildWindow(childWindow, ordered: .Above)
                
                else if numWindows.count == 0 
                    window.contentViewController = destcontroller
                

【问题讨论】:

为什么不在主窗口上创建两个按钮,每个按钮都连接到各自的视图控制器? 【参考方案1】:

不必保留提供窗口内容的默认 segue。如果您删除它并提供两个可以通过 id 实例化的视图控制器,那么您的应用程序委托可以决定何时启动。

如:

let selection: Int = 2

func applicationDidFinishLaunching(aNotification: NSNotification) 
    let storyboard = NSStoryboard(name: "Main", bundle: nil)
    var controller: NSViewController
    if selection == 1 
        controller = storyboard.instantiateControllerWithIdentifier("view_controller") as! NSViewController
     else 
        controller = storyboard.instantiateControllerWithIdentifier("view_controller_2") as! NSViewController
    
    let window = NSApp.windows[0]
    window.contentViewController = controller

【讨论】:

菲利普米尔斯 - 谢谢你 - 但如果我这样做 - 我将如何从这些控制器调用控制器......使用segues? 据我所知,与您在任何其他情况下的情况相同。我刚刚从我的第二个控制器上的一个按钮连接了情节提要中的一个 segue,以将第三个控制器显示为一张表,它工作正常。

以上是关于Cocoa:根据来自 App Delegate 的输入加载不同的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa:从另一个类调用 App Delegate 方法

BlocksKit初见:一个支持将delegate转换成block的Cocoa库

导航栏和导航工具栏不是来自 App Delegate

在 CLI Cocoa 应用程序中,如何实现事件循环?

Cocoa:来自原始数据的 AVAsset(即 NSData)

App Delegate 中 Core Data 堆栈变量中的 Swift 语法歧义