在与当前 window/view 控制器不同的 window/view 控制器中执行代码
Executing code in a different window/view controller from the current window/view controller
我在 Xcode 6 中使用下面的代码用于我正在使用苹果 swift 为 OSx 构建的项目。我没有在此处看到的常用 .m 和 .h 文件。这是一个故事板,每个 window.
都有一个 AppDelegate.swift 和一个 class 文件
下面的代码从 OS X 应用中的主要 window 打开一个额外的 window 来显示视频。如何存储对新 window 对象的引用并使用它来执行当前 window 中新 window 内的函数?我正在尝试在原始视图 controller/window 中创建播放控件以控制新视图 window 中包含的视频。我知道不同的 windows 是不同 classes 的不同实例,但我仍在努力掌握它们如何实时相互交谈,而不是我在何处看到的大多数示例一个视图控制器将信息传递给包含在同一 window.
中的另一个视图控制器
感谢您的帮助!
更新:
建议的答案在最初打开 window 的函数内有效。但是,我无法在不同的函数中访问该方法。我尝试在函数范围之外声明变量,但我无法访问其他 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()
}
}
最终更新:这是允许我从当前 window 中的任何函数访问新 Window 函数的最后工作代码块。我更改了 MainVideoController var 声明的类型以匹配我的自定义 class 并在将内容 ViewController 捕获到变量时添加了条件 "as?" 。感谢@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)
}
}
你可以像这样从NSWindow
的contentViewController
得到NSViewController
。
let viewController = windowController.window?.contentViewController as YourCustomViewController
// do stuff
viewController.method()
我在 Xcode 6 中使用下面的代码用于我正在使用苹果 swift 为 OSx 构建的项目。我没有在此处看到的常用 .m 和 .h 文件。这是一个故事板,每个 window.
都有一个 AppDelegate.swift 和一个 class 文件下面的代码从 OS X 应用中的主要 window 打开一个额外的 window 来显示视频。如何存储对新 window 对象的引用并使用它来执行当前 window 中新 window 内的函数?我正在尝试在原始视图 controller/window 中创建播放控件以控制新视图 window 中包含的视频。我知道不同的 windows 是不同 classes 的不同实例,但我仍在努力掌握它们如何实时相互交谈,而不是我在何处看到的大多数示例一个视图控制器将信息传递给包含在同一 window.
中的另一个视图控制器感谢您的帮助!
更新:
建议的答案在最初打开 window 的函数内有效。但是,我无法在不同的函数中访问该方法。我尝试在函数范围之外声明变量,但我无法访问其他 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()
}
}
最终更新:这是允许我从当前 window 中的任何函数访问新 Window 函数的最后工作代码块。我更改了 MainVideoController var 声明的类型以匹配我的自定义 class 并在将内容 ViewController 捕获到变量时添加了条件 "as?" 。感谢@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)
}
}
你可以像这样从NSWindow
的contentViewController
得到NSViewController
。
let viewController = windowController.window?.contentViewController as YourCustomViewController
// do stuff
viewController.method()