【发布时间】: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)
}
}
【问题讨论】: