【问题标题】:Warning: Attempt to present vc whose view is not in the window hierarchy警告:尝试呈现视图不在窗口层次结构中的 vc
【发布时间】:2017-07-18 18:12:10
【问题描述】:

所以我试图从模型 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)

}

【问题讨论】:

  • 你的主VC嵌入到UINavigationController中了吗?
  • 你可能是从 viewdidload 方法调用它,如果是这样它会给出这个警告
  • @Mannopson yah 在情节提要中设置为使用该代码对我的 NavigationController 进行建模
  • 在关闭操作完成时将通知发布到您的 MainVC。

标签: ios swift xcode uiviewcontroller swift3


【解决方案1】:

先尝试关闭视图控制器:

dismiss(animated: true) {

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

【讨论】:

  • 我添加了我拥有的代码,它与您的相似,但仍然给出相同的错误
  • 您是否在情节提要中创建了手动转场?我不确定你为什么要实例化一个新的视图控制器,它应该已经在你的层次结构中了。
  • 我修改了我的答案。尝试用我的完全替换您的代码。您不应该实例化另一个视图控制器。只要在情节提要中正确创建了手动转场,并且父视图控制器位于层次结构中的下一个,我的代码就应该适合您。
  • 但是在关闭后在侧边菜单视图控制器上添加 performSegue 不会运行。运行该代码时出现此错误 - () 没有标识符为“ToSubmition”的序列。但是,当我将侧边菜单 VC 中的 segue 添加到另一个 VC 时,它表示侧边菜单 VC 不再位于视图层次结构中
  • 你试过我的代码了吗?我在我的应用程序上做同样的事情。我有一个拆分视图控制器,我从左侧将其关闭,并使用此代码返回到上一个 VC。
【解决方案2】:

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

您可以阅读Apple API reference 了解如何实现 NSNotification Center。

【讨论】:

    【解决方案3】:
    • 完成处理程序始终使用 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
        }
      }
      
    • 这是一个盲目的尝试尝试一下。

    【讨论】:

      【解决方案4】:

      好的,我想通了。您不能通过创建实例来调用另一个视图控制器。相反,我当时只是打电话给现在的 VC

      dismiss(animated: true) {
              if let mainView = UIApplication.shared.keyWindow?.rootViewController as? MainViewController {
                  mainView.ToSubmition()
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-23
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        相关资源
        最近更新 更多