2017-09-03 62 views
-1

我正在开发一个macOS项目,其中有一个包含2个其他ViewControllers的分割视图,我无法弄清楚如何从我的主窗口访问ViewControllers视图控制器。使用swift访问其他控制器的方法,操作和/或出口

这是设置:

screenshot of storyboard

基本上我想要做的是使用ButtonViewController在左上角访问Label在我SectionController右侧,这嵌入在我的分割视图中。

由于我无法为其他ViewController中的控件创建IBActionIBOutlet,所以我无法弄清楚如何获得这些连接。我目前的解决方法是在我的AppDelegate上有一个属性,然后访问主共享应用程序委托,但感觉不好,不会扩展。我完全失去了如何继续。我可以使用函数来传递数据或其他ViewController(s)。

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

任何想法?

+0

“既然不能在不同的视图控制器创建一个IBAction为IBOutlet中或对控制”为每个分割创建一个视图控制器子类。如果你为苹果公司工作,那么你为什么不问你的同事? –

+0

每个分裂已经有一个ViewController子类,这就是我添加一些函数/动作/属性,但无法从我的顶级视图达到。还有什么我失踪? Re apple:这是一家大公司,我的部门里没有任何开发人员在xcode/swift/cocoa中工作。 –

回答

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:

这可能是更好的,如果你把在你的 “为赛格瑞准备” 方法,每个孩子控制器参考

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

我需要继承NSSplitViewController才能做到这一点吗?我注意到我是因为分割视图嵌入在容器视图中,从我的顶层视图看,它不可见为“childViewController”,并且它在底部视图中不可见为“父”。我觉得有一些小问题,我错过了如何接线。 –

+0

好吧,摆弄你给我的信息,我想我知道了发生了什么事情(我从来没有处理过赛格)。我会涉猎,但这使我走上了正确的轨道。谢谢!方法1的 –

+0

你不必子类UISplitViewController,你可以通过childViewControllers属性调用它 –

相关问题