【问题标题】:Executing code in a different window/view controller from the current window/view controller在与当前窗口/视图控制器不同的窗口/视图控制器中执行代码
【发布时间】:2015-01-16 08:41:48
【问题描述】:

我在 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()

     }

 }

最终更新:这是允许我从当前窗口中的任何函数访问新窗口函数的最后一个工作代码块。我更改了 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)

     }

 }

【问题讨论】:

    标签: macos swift


    【解决方案1】:

    你可以像这样从NSWindowcontentViewController获取NSViewController

    let viewController = windowController.window?.contentViewController as YourCustomViewController
    // do stuff
    viewController.method()
    

    【讨论】:

    • 效果很好!我忘了提到这是在函数范围内声明的。我在上面的上下文中添加了更多代码。虽然代码在函数内部工作,但我无法在同一个类的另一个函数中访问该方法。我尝试最初在函数之外声明变量,但仍然存在错误(参见代码中的 cmets)。你已经帮了大忙了。谢谢!
    • 实例变量MainVideoController被声明为NSViewController。更新类型 MainVideo?
    • 感谢@bluedome,这正是我所需要的。
    猜你喜欢
    • 2017-12-21
    • 2017-03-09
    • 2013-06-21
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2021-06-24
    • 1970-01-01
    相关资源
    最近更新 更多