容器视图视图控制器中的UIViewController调用函数
问题描述:
使用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提供了解决方案。很抱歉浪费大家的时间。希望这会帮助别人。
答
你得到一个例外的原因是你的currentweather
标签只有在该视图控制器的视图加载时才会从故事板加载。这意味着,当您尝试拨打callJson()
时,视图尚未加载,因此也没有加载IBOutlets
,这意味着它们是nil
。
我建议将一些数据传递给WeatherCurrentViewController
,并且仅在viewDidLoad
更新视图。 viewDidLoad
保证视图和所有的插座加载,而不是无
可能的重复[Objective-c:如何调用容器视图控制器中的方法](http://stackoverflow.com/questions/18321922/objective-c - 如何到调用法在容器 - 视图 - 控制器) – dan