使用swift从其他控制器访问方法、动作和/或出口

使用swift从其他控制器访问方法、动作和/或出口,swift,xcode,macos,xcode9-beta,nssplitview,Swift,Xcode,Macos,Xcode9 Beta,Nssplitview,我正在从事一个macOS项目,其中我有一个包含两个其他ViewController的拆分视图,我不知道如何从主窗口的ViewController访问ViewController 以下是设置: 基本上,我要做的是使用左上角myViewController中的按钮来访问右侧mySectionController中的标签,它嵌入到我的分割视图中 由于我无法在不同的ViewController中为控件创建iAction或iOutlet,因此我不知道如何连接这些控件。我目前的解决方法是在我的AppDel

我正在从事一个macOS项目,其中我有一个包含两个其他ViewController的拆分视图,我不知道如何从主窗口的ViewController访问ViewController

以下是设置:

基本上,我要做的是使用左上角my
ViewController
中的
按钮来访问右侧my
SectionController
中的
标签,它嵌入到我的分割视图中

由于我无法在不同的ViewController中为控件创建
iAction
iOutlet
,因此我不知道如何连接这些控件。我目前的解决方法是在我的
AppDelegate
上有一个属性,然后访问主共享应用程序委托,但这感觉很粗糙,无法扩展。我完全不知道该怎么做。我可以使用函数将数据或任何内容传递给其他ViewController

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


有什么想法吗?

当然,您不能在不同的ViewController中为控件创建iAction或iOutlet!! 但简单地说,层次结构中的每个视图控制器都有其子视图控制器的引用

方法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:

@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”方法中为每个子控制器提供一个参考,可能会更好

ContainerViewController:

var mySplitViewController: YourSplitViewController?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "splitViewSegue" {
        self.mySplitViewController = segue.destination as! 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!"
}
YourSplitViewController:

var mySplitViewController: YourSplitViewController?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "splitViewSegue" {
        self.mySplitViewController = segue.destination as! 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!"
}
因此,您可以像在容器视图控制器中那样访问它:

var mySplitViewController: YourSplitViewController?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "splitViewSegue" {
        self.mySplitViewController = segue.destination as! 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!"
}

“因为我不能在不同的ViewController中为控件创建iAction或iOutlet”,所以为每个拆分创建一个视图控制器子类。如果你为苹果公司工作,为什么不问问你的同事呢?每个拆分都已经有了一个ViewController子类,这就是我添加一些函数/操作/属性的地方,但无法从我的顶层视图实现这一点。我还缺什么吗?Re apple:这是一家大公司,我的部门没有任何在xcode/swift/cocoa中工作的开发人员。为了做到这一点,我需要对NSSplitViewController进行子类化吗?我注意到,由于拆分视图嵌入在容器视图中,因此它在我的顶层视图中不可见作为
childViewController
,在底部视图中不可见作为
parent
。我想在我如何连接这条线路的过程中,我遗漏了一些次要的东西。好吧,摆弄一下你给我的信息,我想我知道发生了什么(我以前从未处理过segues)。我会涉猎,但这让我走上了正确的道路。谢谢对于方法1,您不必子类化UISplitViewController,只需通过childViewControllers属性调用即可。您只需通过以下短方法即可达到所需的效果:让splitViewController=self.childViewControllers[0]as!UISplitViewController;将targetViewController=splitViewController.ChildViewController[0]设为!您的TargetViewController;targetViewController.label.text=“随便什么!”;这成功了!谢谢我试图理解为什么它不起作用,除非我创建了
NSSplitViewController
的子类。实际上,我没有在子类中放入任何代码,这是可行的,如果我没有将其子类化,我从
.childViewControllers
中什么也得不到。但它是有效的,所以我没有抱怨。