【问题标题】:Communication between container view controllers容器视图控制器之间的通信
【发布时间】:2015-04-17 02:10:24
【问题描述】:

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

这是我的故事板:

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

任何建议都会有所帮助。

【问题讨论】:

标签: ios swift


【解决方案1】:

为您的 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". 
}

【讨论】:

  • 好吧,我这样做了,但我不明白它是如何工作的。因为我的 DetailViewFormController 将事件传播到其父级,但是如何广播和更新其他子级的视图?如果我是对的,prepareForSegue 会在创建父视图时调用,所以只调用一次。
  • 我会用更详细的解释更新我的答案。
  • 使用委托而不是设置直接引用不是很有意义吗?另外我们应该考虑使用弱引用,因为它们会有循环依赖还是会被处理?
猜你喜欢
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2015-08-18
相关资源
最近更新 更多