使用 swift 从其他控制器访问方法、操作 and/or 出口

Accessing methods, actions and/or outlets from other controllers with swift

我正在开发一个 macOS 项目,其中我有一个包含 2 个其他 ViewController 的拆分视图,但我不知道如何从我的主 [=] 访问 ViewController 39=]的ViewController.

这是设置:

基本上我想做的是使用左上角 ViewController 中的 Button 来访问 SectionController 中的 Label对,它嵌入在我的拆分视图中。

由于我无法在另一个 ViewController 中为控件创建 IBActionIBOutlet,因此我不知道如何将它们连接起来。我目前的解决方法是在我的 AppDelegate 上设置一个 属性,然后访问主要的共享应用程序委托,但这感觉很笨拙,无法扩展。我完全不知道如何进行。我可以使用函数将数据或其他任何东西传递给其他 ViewController(s).

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

有什么想法吗?

当然你不能在不同的 ViewController 中为控件创建 IBAction 或 IBOutlet!! 但是层次结构中的每个视图控制器都有一个对其子视图控制器的引用。

方法一:

@IBAction func buttonTapped(_ sender: Any) {
    let splitViewController = self.childViewControllers[0] as! YourSplitViewController
    let targetViewController = splitViewController.childViewControllers[0] as! YourTargetViewController
    targetViewController.label.text = "Whatever!"
}

方法二:

如果您在 "prepare for segue" 方法中对每个子控制器进行引用可能会更好

容器ViewController:

var mySplitViewController: YourSplitViewController?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "splitViewSegue" {
        self.mySplitViewController = segue.destination as! YourSplitViewController
    }
}

你的分裂ViewController:

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