容器视图控制器之间的通信

时间:2015-04-16 16:14:18

标签: ios swift

我是iOS开发的新手,我遇到了问题。 这是我的申请。 screenshot 我想要实现的是当我点击开关时,它应该更新tableview概率。

这是我的故事板: storyboard

我可以使用委托协议获取DetailViewController(左侧控制器,祖先)中的开关更改值。但现在我不知道如何将新值广播到DetailChartViewController。 DetailChartViewController是一个包含UITableViewControllers的UIPageViewController(如屏幕截图所示)。那么如何从孩子到孩子的父母广播新的价值呢?我必须使用观察者模式吗?通知中心?

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:4)

为detailChartViewController创建一个var,然后直接设置它。您可以在prepareForSegue方法中指定var。创建容器视图时,需要为嵌入式控制器设置标识符。然后,您的prepareForSegue方法将触发,您将该var分配给控制器。如果要从子级访问父级,可以从prepareForSegue func中传递对父级的引用,也可以创建协议/委托以进行回传(通常是首选)。

var detailFormViewController:DetailFormViewController? // Set the identifier for both of these in the identity inspector of these views in the storyboard
var detailViewController:DetailViewController?

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
     if segue.identifier == "DetailView" {
         self.detailViewController = segue.destinationViewController as! DetailViewController
         // You can always pass the parent to the child like below although a delegate is a more preferred technique
         self.detailViewController.parentViewController = self
     } else if segue.identifier == "DetailFormViewController" {
         self.detailFormViewController = segue.destinationViewController as! DetailFormViewController
     }
}

func someFunction() {
     // Now that you have a reference to your container view controllers you can access any of their objects directly from your parent view. 
     self.detailViewController.labelSomething.text = "Something"
     self.detailFormViewController.labelSomethingElse.text = "Something else". 
}