UIViewController在容器视图viewcontroller中调用函数

时间:2016-11-21 19:02:44

标签: ios swift

使用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提供了解决方案。抱歉浪费每个人的时间。希望这会帮助其他人。

1 个答案:

答案 0 :(得分:1)

您获得异常的原因是,只有当该视图控制器的视图加载时,才会从故事板加载currentweather标签。这意味着,当您尝试调用callJson()时,视图尚未加载,因此尚未加载IBOutlets,这意味着它们为nil

我建议将一些数据传递给WeatherCurrentViewController,并仅在viewDidLoad更新视图。 viewDidLoad保证视图和所有出口都已加载且不是零