使用Swift 3.这个问题已经存在,并且有很多例子。不幸的是,他们都没有为我工作。我有一个具有容器视图的uiviewcontroller。此容器视图具有到另一个视图控制器的segue。一切都正确加载并在第一次正确显示。我面临的问题是我在主uiviewcontroller上有一个按钮,通过点击它,它将刷新容器视图。这就是问题所在。子控制器中的插座是零。
这就是我尝试子控制器中所有功能的方法。
let wcvc = self.storyboard!.instantiateViewController(withIdentifier: "WeatherCurrentViewController") as! WeatherCurrentViewController
wcvc.callJson()
在子控制器中,标签就像这样
@IBOutlet var currentweather: UILabel!
但是在调用的函数中,当我尝试执行时解包一个Optional值时,我得到一个意外发现nil的错误
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 :(得分:1)
您获得异常的原因是,只有当该视图控制器的视图加载时,才会从故事板加载currentweather
标签。这意味着,当您尝试调用callJson()
时,视图尚未加载,因此尚未加载IBOutlets
,这意味着它们为nil
。
我建议将一些数据传递给WeatherCurrentViewController
,并仅在viewDidLoad
更新视图。 viewDidLoad
保证视图和所有出口都已加载且不是零