在与当前窗口/视图控制器不同的窗口/视图控制器中执行代码

cob*_*obb 6 macos swift

我在 Xcode 6 中使用下面的这段代码,用于我正在使用 apple swift 为 OSx 构建的项目。我没有在这里看到的常用 .m 和 .h 文件。它是一个带有 AppDelegate.swift 和每个窗口的类文件的故事板。

下面的代码从 OS X 应用程序的主窗口打开一个附加窗口以显示视频。如何存储对新窗口对象的引用并使用它从当前窗口执行新窗口内的函数?我正在尝试在原始视图控制器/窗口中创建播放控件来控制新窗口中包含的视频。我知道不同的窗口是不同类的不同实例,但我仍然试图掌握它们如何实时相互交谈,而不是我见过的大多数示例,其中一个视图控制器将信息传递给另一个视图控制器包含在同一个窗口中。

谢谢你的帮助!

更新:

建议的答案在最初打开窗口的函数内起作用。但是,我无法在不同的函数中访问该方法。我尝试在函数范围之外声明变量,但我无法访问其他 ViewController 中的方法

 class ViewController: NSViewController {

     var MainVideoControllerWindow: NSWindowController?
     var MainVideoController: NSViewController?

     @IBAction func openPanel(sender: AnyObject) {

         if (MainVideoControllerWindow == nil) {

             //THIS SECTION WORKS PERFECTLY
             let storyboard = NSStoryboard(name: "Main", bundle: nil)
             MainVideoControllerWindow = storyboard?.instantiateControllerWithIdentifier("MainVideo") as? NSWindowController
             MainVideoControllerWindow!.showWindow(sender)

             //THIS LINE WORKS AS SUGGESTED
             let MainVideoController = MainVideoControllerWindow!.window?.contentViewController as MainVideo

             //I CAN ACCESS THIS METHOD CONTAINED IN OTHER VIEW CONTROLLER
             MainVideoController.playVideo(sender)

             //TRYING THIS INSTEAD TO ALLOW ACCESS TO OTHER FUNCTIONS WITHIN THIS CLASS
             MainVideoController = MainVideoControllerWindow!.window?.contentViewController as MainVideo

             //THIS LINE RESULTS IN AN ERROR (NSViewController? does not have a member named playVideo)
             MainVideoController.playVideo(sender)

             //I TRIED UNWRAPPING IT AND STILL THE SAME ERROR
             MainVideoController!.playVideo(sender)

         } else {
             MainVideoControllerWindow!.showWindow(sender)
         }

     }

     @IBAction func btnPlayVideo(sender: AnyObject) {

         //CANNOT ACCESS THE METHOD HERE
         MainVideoController.playVideo()

     }

 }
Run Code Online (Sandbox Code Playgroud)

最终更新:这是最后一个工作代码块,它允许我从当前窗口中的任何函数访问新窗口的函数。我更改了 MainVideoController var 声明的类型以匹配我的自定义类并添加了条件“as?” 将 contentViewController 捕获到变量中时。谢谢@bluedome 的帮助!

 class ViewController: NSViewController {

     var MainVideoControllerWindow: NSWindowController?
     var MainVideoController: MainVideo?

     @IBAction func openPanel(sender: AnyObject) {

         if (MainVideoControllerWindow == nil) {

             //OPEN NEW WINDOW
             let storyboard = NSStoryboard(name: "Main", bundle: nil)
             MainVideoControllerWindow = storyboard?.instantiateControllerWithIdentifier("MainVideo") as? NSWindowController
             MainVideoControllerWindow!.showWindow(sender)

             //SAVE REFERENCE TO VIEW CONTROLLER IN NEW WINDOW
             MainVideoController = MainVideoControllerWindow!.window?.contentViewController as? MainVideo

         } else {
             MainVideoControllerWindow!.showWindow(sender)
         }

     }

     @IBAction func btnPlayVideo(sender: AnyObject) {

         //CAN ACCESS THE METHOD IN OTHER WINDOW'S VIEW CONTROLLER HERE
         MainVideoController!.playVideo(sender)

     }

 }
Run Code Online (Sandbox Code Playgroud)

blu*_*ome 5

你可以像这样NSViewControllerNSWindow's得到contentViewController

let viewController = windowController.window?.contentViewController as YourCustomViewController
// do stuff
viewController.method()
Run Code Online (Sandbox Code Playgroud)