2015-04-16 70 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