使用swift访问其他控制器的方法,操作和/或出口

时间:2017-09-03 21:03:12

标签: swift xcode macos xcode9-beta nssplitview

我正在开发一个macOS项目,我有一个包含2个其他ViewControllers的拆分视图,我无法弄清楚如何从我的主窗口的ViewController访问ViewControllers。

这是设置:

screenshot of storyboard

基本上我尝试做的是使用左上角Button中的ViewController来访问我Label上的SectionController右,这是嵌入我的拆分视图。

由于我无法在其他ViewController中为控件创建IBActionIBOutlet,因此我无法弄清楚如何将这些控件连接起来。我目前的解决方法是在我的AppDelegate上拥有一个属性,然后访问主要的共享应用程序代理,但这样做很麻烦并且不会扩展。我完全迷失了如何继续。我可以使用函数将数据传递给其他ViewController。

我使用Swift 4和Xcode 9(测试版)。

有什么想法吗?

1 个答案:

答案 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!"
}