Attempt to present vc whose view is not in the window hierarchy
10,557
Solution 1
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)
Solution 2
If you are attempting to present a modal view controller within the viewDidLoad method, can try to move this call to the viewDidAppear: method.
Solution 3
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()
Related videos on Youtube
Author by
Aya Aboud
Updated on June 04, 2022Comments
-
Aya Aboud almost 2 years
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?
-
Larme almost 7 years
PrintVacationDecisionVC
is not visible, so it can't present theUIDocumentInteractionController
. -
Aya Aboud almost 7 yearsLink not solve my problem which i make long search before post problem
-
-
Aya Aboud almost 7 yearswhen i try to use code there are error in line of window (type vc has no member window) and getCurrentViewController undefined
-
Prashant Tukadiya almost 7 yearsDid you try with AppDelegate's window ?
-
Aya Aboud almost 7 yearsDid you mean use AppDelegate instead of self
-
Prashant Tukadiya almost 7 yearstry like ((UIApplication.sharedApplication.deletgate) as! AppDelegate).window
-
Aya Aboud almost 7 yearsunresolved identifier (getCurrentViewController)
-
Prashant Tukadiya almost 7 yearsI have updated Answer , It will be more helpful to you
-
Aya Aboud almost 7 yearsLet us continue this discussion in chat.
-
Alex Merlin almost 6 yearsThis Works! Thank You!
-
Lance Samaria over 5 yearsNice solution! I've been looking around for a couple of hours and it's the only thing that I could find that works
-
Arash Afsharpour about 5 yearsI 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