2016-11-21 100 views
0

使用Swift 3.這個問題一直存在,並且有很多例子。不幸的是他們都沒有爲我工作。我有一個擁有容器視圖的uiviewcontroller。這個容器視圖有一個segue到另一個視圖控制器。一切正確加載並且第一次正確顯示。我面臨的問題是我在主uiviewcontroller上有一個按鈕,通過點擊它,它將刷新容器視圖。這是問題所在。子控制器中的插座是零。容器視圖視圖控制器中的UIViewController調用函數

這是我如何試圖在子控制器中的所有功能。

let wcvc = self.storyboard!.instantiateViewController(withIdentifier: "WeatherCurrentViewController") as! WeatherCurrentViewController 
    wcvc.callJson() 

在子控制器的標籤是像這樣

@IBOutlet var currentweather: UILabel! 

但在被調用的函數,我得到意外發現零的錯誤,同時展開一個可選值,當我嘗試做

print(currentweather) 

任何人都知道我能做些什麼來調用視圖控制器中的一個函數,該視圖控制器通過容器視圖中的segue加載並且仍然具有有效的插座?請讓我知道是否需要更多信息。

找到解決方案。我需要使用segues標識符而不是故事板。這樣做

private var currentEmbeddedViewController: WeatherCurrentViewController!  
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let cvc = segue.destination as? WeatherCurrentViewController, segue.identifier == "CurrentWeather" { 
     self.currentEmbeddedViewController = cvc 
    } 
} 

,並調用該函數在控制器中,像這樣

self.currentEmbeddedViewController.callJson() 

是解決辦法。這question提供瞭解決方案。很抱歉浪費大家的時間。希望這會幫助別人。

+0

可能的重複[Objective-c:如何調用容器視圖控制器中的方法](http://stackoverflow.com/questions/18321922/objective-c - 如何到調用法在容器 - 視圖 - 控制器) – dan

回答

1

你得到一個例外的原因是你的currentweather標籤只有在該視圖控制器的視圖加載時纔會從故事板加載。這意味着,當您嘗試撥打callJson()時,視圖尚未加載,因此也沒有加載IBOutlets,這意味着它們是nil

我建議將一些數據傳遞給WeatherCurrentViewController,並且僅在viewDidLoad更新視圖。 viewDidLoad保證視圖和所有的插座加載,而不是無

相關問題