警告:尝试显示视图不在窗口层次结构中的vc

时间:2017-02-27 23:10:52

标签: ios swift xcode uiviewcontroller swift3

所以我试图从模型VC提示一个segue在根VC上运行但是当我尝试这样做时它给了我这个错误 - 警告:尝试呈现视图不在窗口层次结构中的vc 。我尝试了viewWIllAppear(),但这也行不通,因为我的VC只覆盖根vc视图的一半,因为它是一个侧边菜单。但是,在直接从根VC提示segue之后,它可以正常工作。

这是我的代码:

dismiss(animated: true) {

    let vc = self.storyboard?.instantiateViewController(withIdentifier: "MainViewController") as? MainViewController
    vc?.performSegue(withIdentifier: "ToSubmition", sender: self)

}

4 个答案:

答案 0 :(得分:0)

首先尝试解除视图控制器:

dismiss(animated: true) {

    self.dismiss(animated: true) { 
        self.performSegue(withIdentifier: "ToSubmition", sender: self)
    }
}

答案 1 :(得分:0)

我认为你正试图从你的侧边菜单中呈现一个VC,这当然不能完成,因为视图不在窗口的层次结构中。您可以做的是在调用函数后使用NSNotificationCenter发布通知密钥并关闭侧边菜单。然后在您的主VC中,添加一个观察者并创建一个函数来执行您想要的segue。

您可以阅读Apple API reference有关如何实施NSNotification Center的信息。

答案 2 :(得分:0)

  • 完成处理程序始终使用background thread,进行UI更新或类似您的使用main thread

    dismiss(animated: true) {
      DispatchQueue.main.async {
        let vc = self.storyboard?.instantiateViewController(withIdentifier: "MainViewController") as? MainViewController
        vc?.performSegue(withIdentifier: "ToSubmition", sender: self)
      }
    }
    
  • 如果失败则使用dispatch_after并在执行segue之前设置一些延迟。

    dismiss(animated: true) {
      let mainQueue = DispatchQueue.main
      let deadline = DispatchTime.now() + .seconds(5)
      mainQueue.asyncAfter(deadline: deadline) {
         // ...perform segue
      }
    }
    
  • 这是一个盲目的尝试。

答案 3 :(得分:0)

好的,我明白了。您无法通过创建实例来调用另一个视图控制器。相反,我当时只调用了当前的VC

class myTransformer: ValueTransformer {

override func valueClassForBinding(_ binding: String) -> AnyClass? {
    return NSString.self
}

override func transformedValue(_ value: Any?) -> Any? {
    return "test"
}


}