Swift segue not working?

后端 未结 6 1518
一个人的身影
一个人的身影 2021-01-14 09:50

My Swift segue is not working at all and isn\'t throwing any errors. The breakpoint shows me that the app lands on this line but nothing happens:

self.perfor         


        
相关标签:
6条回答
  • 2021-01-14 10:20

    Performing a segue leads to present a new view controller.You don't need to and can't create and show view controller in prepareForSegue.It will look like:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
        {
            if (segue.identifier == "SignupSegue") {
    
                let vc = segue.destinationViewController
    
            }
        }
    
    0 讨论(0)
  • 2021-01-14 10:22

    Swift 3 solved:

        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
                if (segue.identifier == "SignupSegue") {
                    DispatchQueue.main.async {
                        let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                        let vc = storyboard.instantiateViewController(withIdentifier: "SignUpViewController")
                        self.show(vc, sender: self) 
                    }
              }
        }
    
    0 讨论(0)
  • 2021-01-14 10:32

    The closest I can get to overcome same problem for myself:

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

    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)
            }
        }
    
    0 讨论(0)
  • 2021-01-14 10:40

    Ok. I just tried it out. Hope you did all the things regarding StoryBoard Reference. Me too had the same issue with performSegueWithIdentifier.

    Example: Let take two storyboard main and signup.

    1) In main.storyboard create a storyboard reference. Set the storyboardId in the Storyboard Reference as signup and the referencedId as the storyboardId of the scene(viewController) which is in signup.storyboard. Look at this link for a clear picture Storyboard to Storyboard

    2) Set the segue identifier between viewController and Storyboard Reference in main.storyboard

    3) Since I faced the same problem with performSegueWithIdentifier, I replaced it with shouldPerformSegueWithIdentifier.

    override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool {
        if(identifier == "segue_identifier"){
           // segue_identifier is the viewController and storyBoard Reference segue identifier.
            print("hello")
        }
        return true;
    }
    

    Let me know if you find any issues. It did work for me.

    0 讨论(0)
  • 2021-01-14 10:42

    You can try this ...

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
        {
        if (segue.identifier == "SignupSegue") {
            if let destination = segue.destination as? SignUpViewController {
             ...
            }
    
        }
    }
    
    0 讨论(0)
  • 2021-01-14 10:45

    Generally, any UI updating has to be in main thread. I think the block for PFFacebookUtils.logInInBackgroundWithAccessToken is still in the background state in above situation. Maybe trigger the showViewController in dispatch_async(dispatch_get_main_queue(), {}) and see if there is any difference.

    dispatch_async(dispatch_get_main_queue(), {
        let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("SignUpViewController")
        self.showViewController(vc, sender: self)
    })
    
    0 讨论(0)
提交回复
热议问题