Swift segue不工作?

时间:2016-03-12 02:24:26

标签: ios swift facebook segue

我的Swift segue完全没有工作,也没有任何错误。断点告诉我应用程序落在这条线上但没有任何反应:

self.performSegueWithIdentifier("SignupSegue", sender: self)

代码块是Facebook的登录表单:

if let accessToken: FBSDKAccessToken = FBSDKAccessToken.currentAccessToken() {
    PFFacebookUtils.logInInBackgroundWithAccessToken(result.token, block: {
        (user: PFUser ? , error : NSError ? ) - > Void in
        if user!.isNew {
            self.performSegueWithIdentifier("SignupSegue", sender: self)
        } else {
            self.navigateToInGame(true)
        }
    })
}

这里有它应该调用的segue函数,但是它甚至没有达到它:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    {
        if (segue.identifier == "SignupSegue") {
            let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewControllerWithIdentifier("SignUpViewController") 
            self.showViewController(vc, sender: self)
        }
    }

有什么想法吗?

6 个答案:

答案 0 :(得分:2)

通常,任何UI更新都必须在主线程中。我认为PFFacebookUtils.logInInBackgroundWithAccessToken的阻止在上述情况下仍然处于后台状态。也许会触发showViewController中的dispatch_async(dispatch_get_main_queue(), {})并查看是否存在任何差异。

dispatch_async(dispatch_get_main_queue(), {
    let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let vc = storyboard.instantiateViewControllerWithIdentifier("SignUpViewController")
    self.showViewController(vc, sender: self)
})

答案 1 :(得分:2)

确定。我刚试了一下。希望你做了关于StoryBoard Reference的所有事情。 我也遇到了与performSegueWithIdentifier相同的问题。

实施例: 我们来两个故事板注册

1)在main.storyboard中创建一个故事板参考。将故事板参考中的storyboardId设置为signup,将referencedId设置为storyboardId中场景(viewController)的signup.storyboard。请查看此链接以获得清晰的图片Storyboard to Storyboard

2)在viewController

中的Storyboard Referencemain.storyboard之间设置segue标识符

3)由于我遇到performSegueWithIdentifier同样的问题,我将其替换为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;
}

如果您发现任何问题,请告诉我。它对我有用。

答案 2 :(得分:1)

执行segue会导致呈现一个新的视图控制器。您不需要也不能在prepareForSegue中创建和显示视图控制器。它将如下所示:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    {
        if (segue.identifier == "SignupSegue") {

            let vc = segue.destinationViewController

        }
    }

答案 3 :(得分:0)

Swift 3解决了:

[w[i], W-w].min

答案 4 :(得分:0)

你可以试试这个......

errno = 0;
some_function();
if ( errno ) {
      :
      :

答案 5 :(得分:0)

最接近我可以为自己克服同样的问题:

在类中初始化的触发器 var segueLogin:Bool = false

当PFFacebookUtils获得segue所需的值时,将触发器更改为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
            }
        }

然后将代码添加到 viewDidAppear 类。实现它每次PFFacebookUtils完成时启动。因此它会检查返回值是否为true并在成功执行PFFacebookUtils会话后执行segue:

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