2

I'm trying to open file in thread and here is my code:

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) }) 

when move to main screen this warning is displayed and file not open

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

Any help to solve this problem?

2
  • PrintVacationDecisionVC is not visible, so it can't present the UIDocumentInteractionController. Commented Jul 27, 2017 at 10:16
  • Link not solve my problem which i make long search before post problem Commented Jul 27, 2017 at 11:57

3 Answers 3

21

Add extention given bellow to your application and use it any where you want to present any view controller, it works for me hope it helps you.

//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 } } 

And Present it by following code:

 UIApplication.topViewController()?.present(vc, animated: true, completion: nil) 
Sign up to request clarification or add additional context in comments.

2 Comments

Nice solution! I've been looking around for a couple of hours and it's the only thing that I could find that works
I still have the same issue even after trying this, I wanna present a ViewController in my MainViewController after checking if the user is authenticated, but it doesn't work, I also do Pure swift code for views, no storyboard at all
4

If you are attempting to present a modal view controller within the viewDidLoad method, can try to move this call to the viewDidAppear: method.

Comments

1

You need to find top view controller

From

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() } 

}

How to use

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

7 Comments

when i try to use code there are error in line of window (type vc has no member window) and getCurrentViewController undefined
Did you try with AppDelegate's window ?
Did you mean use AppDelegate instead of self
try like ((UIApplication.sharedApplication.deletgate) as! AppDelegate).window
unresolved identifier (getCurrentViewController)
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.