Facebook登录Swift后不会触发Segue

kmy*_*pwn 5 facebook ios facebook-sdk-4.0 swift

在此先感谢您的帮助!

我正在写一个快速的应用程序上实现facebook登录,我在登录完成后执行segue时遇到了一些麻烦.

作为FBSDKLoginButtonDelegate的一部分,我有两种方法:

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result:
 FBSDKLoginManagerLoginResult!, error: NSError!)
    {}
Run Code Online (Sandbox Code Playgroud)

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!)
    {}
Run Code Online (Sandbox Code Playgroud)

登录按钮被正确地实施,我能够读取权限/ FB令牌,并通过这个到亚马逊Cognito.

但奇怪的是,我无法以编程方式将登录信息转换为不同的视图(控制器).

按下FB登录按钮将用户带到Web浏览器(Facebook SDK处理所有这些),然后进行登录.

如果我放置一个segue,如:

dispatch_async(dispatch_get_main_queue(), {
        self.performSegueWithIdentifier("segueLoginViewtoHome", sender: nil })
Run Code Online (Sandbox Code Playgroud)

在loginButton()中,它永远不会真正执行(即,当Web浏览器消失时,用户返回到具有登录按钮的视图,而不是segue想要的新视图).我相信该行在浏览器窗口返回到包含登录按钮(和segue)的视图之前执行,但我不知道如何告诉程序"等待"视图成为唯一一个活动且再次可见的视图执行segue.

我相信是这种情况,因为如果我将相同的segue代码放入loginButtonDidLogOut()中,那里不需要切换到浏览器,则在从"滑出"的工作表中按下"注销"后,segue执行得很好屏幕的底部.

此视图控制器已正确设置为委托,如下所示,如果编码在注销时发生,则segue正常运行.

任何帮助将不胜感激,为长期问题道歉,并谢谢!

Dee*_*lue 12

我通过创建一个名为fbLoginSuccess的全局布尔值来修复此问题,该布尔值初始化为false.如果Facebook登录成功,那么我将fbLoginSuccess设置为true,执行你的segue.然后,如果fbLoginSuccess为true,我覆盖viewDidAppear()并在那里执行segue.这解决了它,因为viewDidAppear()是在从浏览器窗口返回后执行的,这就是你想要的.

var fbLoginSuccess = false

override func viewDidAppear(animated: Bool) {
    if (FBSDKAccessToken.currentAccessToken() != nil && fbLoginSuccess == true)
    {
        performSegueWithIdentifier("loginSegue", sender: self)
    }
}

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
    print("User Logged In")

    if ((error) != nil) {
        // Process error
        print(error)
    }
    else if result.isCancelled {
        // Handle cancellations
    }
    else {
        fbLoginSuccess = true
        // If you ask for multiple permissions at once, you
        // should check if specific permissions missing
        if result.grantedPermissions.contains("email") {
            // Do work
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!