我正在开发一个macOS项目,我有一个包含2个其他ViewControllers的拆分视图,我无法弄清楚如何从我的主窗口的ViewController访问ViewControllers。
这是设置:
基本上我尝试做的是使用左上角Button
中的ViewController
来访问我Label
上的SectionController
右,这是嵌入我的拆分视图。
由于我无法在其他ViewController中为控件创建IBAction
或IBOutlet
,因此我无法弄清楚如何将这些控件连接起来。我目前的解决方法是在我的AppDelegate
上拥有一个属性,然后访问主要的共享应用程序代理,但这样做很麻烦并且不会扩展。我完全迷失了如何继续。我可以使用函数将数据传递给其他ViewController。
我使用Swift 4和Xcode 9(测试版)。
有什么想法吗?
答案 0 :(得分:1)
当然,您无法在不同的ViewController中为控件创建IBAction或IBOutlet! 但是,层次结构中的每个视图控制器都只有其子视图控制器的引用。
方法1:
@IBAction func buttonTapped(_ sender: Any) {
let splitViewController = self.childViewControllers[0] as! YourSplitViewController
let targetViewController = splitViewController.childViewControllers[0] as! YourTargetViewController
targetViewController.label.text = "Whatever!"
}
方法2:
如果您为"准备segue"中的每个子控制器提供参考可能会更好。方法
ContainerViewController:
var mySplitViewController: YourSplitViewController?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "splitViewSegue" {
self.mySplitViewController = segue.destination as! YourSplitViewController
}
}
YourSplitViewController:
var aViewController: YourFirstViewController?
var bViewController: YourSecondViewController?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "aViewSegue" {
self.aViewController = segue.destination as! YourFirstViewController
} else if segue.identifier == "bViewSegue" {
self.bViewController = segue.destination as! YourSecondViewController
}
}
因此您可以像在容器视图控制器中那样访问它:
@IBAction func buttonTapped(_ sender: Any) {
self.mySplitViewController.firstViewController.label.text = "Whatever!"
}