2015-04-16 68 views
3

我是iOS开发新手,我遇到了一个问题。 这是我的应用程序。 screenshot 我想实现的是当我点击开关时,它应该更新tableview概率。集装箱视图控制器之间的通信

这是我的故事板: storyboard

我能够有一个委托协议,以获得在DetailViewController(左边的控制器,祖先)开关的变化值。但是现在我不知道如何将新值广播给DetailChartViewController。 DetailChartViewController是一个包含UITableViewControllers的UIPageViewController(如屏幕截图所示)。那么我怎么能从孩子向父母传播一个新的价值?我必须使用观察者模式吗?通知中心?

任何建议都会有帮助。

+0

看看这个如何获得对你包含的视图控制器的引用:http://stackoverflow.com/questions/29582200/how-do-i-get-the-views-inside-a -container-in-swift/29582305#29582305 – ABakerSmith

回答

4

为您的detailChartViewController创建一个var,然后直接设置它。您可以在您的prepareForSegue方法中分配var。当你创建一个容器视图时,你需要为嵌入式控制器设置它的标识符。然后您的prepareForSegue方法将会触发,这是您将该var分配给控制器的地方。如果你想从孩子访问你的父母,你可以在prepareForSegue函数中传递一个对你父母的引用,或者创建一个协议/委托来传递回(通常是首选)。

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

嗯,我这样做了,但我不明白它是如何工作的。因为我的DetailViewFormController将事件传播给它的父节点,但是如何广播和更新其他孩子的视图?如果我是对的,prepareForSegue被称为父视图创建,所以只调用一次。 – prbaron

+0

我会用更详细的解释更新我的答案。 –

+0

使用代表而不是设置直接引用是否有意义?我们是否应该考虑使用弱引用,因为它们将具有循环依赖关系或将被处理? – Warpzit