Moaz Khan
Moaz Khan

Reputation: 1352

Swift 3 Attempt to present whose view is not in the window hierarchy

This question has been asked many times but even after trying most of the possible things I am still unable to find a solution that works for me. Here is the error message.

Warning: Attempt to present on <0x7f8f29e17590> whose view is not in the window hierarchy!

Note: I am not using any navigation controller.

I am just presenting a view controller modally and I have a button on it for linkedIn sign up. But every time I click the linkedin button this error appears and I am unable to see the new linkedIn dialog although it works fine in other classes.

Most solutions recommend handling button click in viewDidAppear already tried that and it doesn't work.

I am using this code for opening linkedIn signup form

linkedinHelper.authorizeSuccess({ [unowned self] (lsToken) -> Void in

        print("success lsToken: \(lsToken)")
        self.requestProfile()
        }, error: { [unowned self] (error) -> Void in

            print("Encounter error: \(error.localizedDescription)")
        }, cancel: { [unowned self] () -> Void in

            print("User Cancelled!")
    })

Upvotes: 5

Views: 9268

Answers (2)

codingCartooningCPA
codingCartooningCPA

Reputation: 711

In my instance, I was navigating to my home view, which had a sheet modifier. Once I removed the sheet modifier, the warning message went away. To maintain my sheet modifier, I created a separate view for it (below) and can now navigate to Home() directly, which was satisfactory for my requirements.

struct IntroSheetView: View {
    @State private var isPresented = true
    
    var body: some View {
        Home()
            .sheet(isPresented: $isPresented) {
                Text("Sheet content")
            }
    }
}

Upvotes: 0

Moaz Khan
Moaz Khan

Reputation: 1352

I have resolved the issue the main problem is exactly what it says the view is not in the view hierarchy. In order to resolve this issue we need to set the root view controller to the current view controller using the appDelegate object. So that the view now comes in the view hierarchy and be able to present further views. Here is the code

let initialViewController = UIStoryboard(name: "Main", bundle:nil).instantiateInitialViewController() as UIViewController
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
appDelegate.window?.rootViewController = initialViewController

Please read this for further information. https://stackoverflow.com/a/27608804/5123516

Upvotes: 7

Related Questions