尝试呈现其视图不在窗口层次结构中的vc

我试图在线程中打开文件,这里是我的代码:

DispatchQueue.main.async(execute: { () -> Void in var documentsURL = (FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)).appendPathComponent(“File.pdf") self.docController = UIDocumentInteractionController.init(url: documentsURL as URL) self.docController?.delegate = self as? UIDocumentInteractionControllerDelegate self.docController?.presentPreview(animated: true) self.docController?.presentOpenInMenu(from: CGRect.zero, in: self.view, animated: true) }) 

当移动到主屏幕时,此警告显示,文件未打开

 Warning: Attempt to present <_UIDocumentActivityViewController: 0x...> on <HCM.PrintVacationDecisionVC: 0x...> whose view is not in the window hierarchy! 

任何帮助解决这个问题?

给你的应用程序添加扩展,并在任何你想呈现任何视图控制器的地方使用它,它为我工作希望它可以帮助你。

 //MARK: - UIApplication Extension extension UIApplication { class func topViewController(viewController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { if let nav = viewController as? UINavigationController { return topViewController(viewController: nav.visibleViewController) } if let tab = viewController as? UITabBarController { if let selected = tab.selectedViewController { return topViewController(viewController: selected) } } if let presented = viewController?.presentedViewController { return topViewController(viewController: presented) } return viewController } } 

并通过以下代码呈现:

  UIApplication.topViewController()?.present(vc, animated: true, completion: nil) 

如果您试图在viewDidLoad方法中呈现模式视图控制器,可以尝试将此调用移至viewDidAppear:方法。

你需要find顶级视图控制器

https://stackoverflow.com/a/26859650/4601900

 extension UIViewController { func topMostViewController() -> UIViewController { // Handling Modal views if let presentedViewController = self.presentedViewController { return presentedViewController.topMostViewController() } // Handling UIViewController's added as subviews to some other views. else { for view in self.view.subviews { // Key property which most of us are unaware of / rarely use. if let subViewController = view.nextResponder() { if subViewController is UIViewController { let viewController = subViewController as UIViewController return viewController.topMostViewController() } } } return self } } } extension UITabBarController { override func topMostViewController() -> UIViewController { return self.selectedViewController!.topMostViewController() } } extension UINavigationController { override func topMostViewController() -> UIViewController { return self.visibleViewController.topMostViewController() } 

}

如何使用

  UIApplication.sharedApplication().keyWindow!.rootViewController!.topMostViewController()