PFFacebookUtils.logInInBackground do not perform segue

112 Views Asked by At

Hei, the code bellow somehow doesn't work with segue. It returns:

Warning: Attempt to present on whose view is not in the window hierarchy!

Code runs in IBAction Button. Then I perform segue without PFFacebookUtils code, it works fine. From that i guess segue can't be called from PFFacebookUtils because it works somehow in background.

Code:

PFFacebookUtils.logInInBackground(withReadPermissions: permissions) {
            (user: PFUser?, error: Error?) -> Void in
            if let user = user {
                if user.isNew {
                    print("User signed up and logged in through Facebook!")
                    self.performSegue(withIdentifier: "segueSignUpWindow", sender: nil)

                } else {
                    print("User logged in through Facebook!")
                    self.performSegue(withIdentifier: "segueSignUpWindow", sender: self)
            } else {
                print("Uh oh. The user cancelled the Facebook login.")
                self.loginCancelledLabel.alpha = 1
            }
        }

I've tried to insert additional code like:

DispatchQueue.main.async {
                let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let vc = storyboard.instantiateViewController(withIdentifier: "SignUp")
                self.show(vc, sender: self)
                print("Hello")

Or with function:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "segueSignUpWindow") {
            DispatchQueue.main.async {
                let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let vc = storyboard.instantiateViewController(withIdentifier: "SignUp")
                self.show(vc, sender: self)
                print("Hello")
            }
        }

Nothing works. Does anyone has a working solution? My goal is to make segue to another storyboard after sign in or login proceeded.

I've looked to most threads in stackoverflow. Didn't find working solution.

1

There are 1 best solutions below

0
On

The closest I can get:

Made trigger var segueLogin : Bool = false with initialised value.

When PFFacebookUtils gets needed values for segue, change trigger to true:

PFFacebookUtils.logInInBackground(withReadPermissions: permissions) {
            (user: PFUser?, error: Error?) -> Void in
            if let user = user {
                if user.isNew {
                    print("User signed up and logged in through Facebook!")
                    self.segueLogin = true

                } else {
                    print("User logged in through Facebook!")
                    self.segueLogin = true
                }
            } else {
                print("Uh oh. The user cancelled the Facebook login.")
                self.loginCancelledLabel.alpha = 1
            }
        }

Then added code to viewDidAppear class. Realised it starts everytime PFFacebookUtils complete. So it checks if returned value is true and performs segue after successful PFFacebookUtils session:

override func viewDidAppear(_ animated: Bool) {
        if segueLogin == true {
            self.performSegue(withIdentifier: "segueSingup", sender: self)
        }
    }