提前感谢您的帮助!
我正在我正在编写的swift应用程序上实现facebook登录,并且在登录完成后我在执行segue时遇到了一些问题。
作为FBSDKLoginButtonDelegate的一部分,我有两种方法:
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result:
FBSDKLoginManagerLoginResult!, error: NSError!)
{}
和
func loginButtonDidLogOut(loginButton: FBSDKLoginButton!)
{}
登录按钮正确实现,我能够读取权限/ FB令牌,并将其传递到Amazon Cognito。
但奇怪的是,我无法以编程方式从登录中删除,进入不同的视图(控制器)。
按下FB登录按钮会将用户带到Web浏览器(Facebook SDK处理所有这些),然后进行登录。
如果我放置一个segue,例如:
dispatch_async(dispatch_get_main_queue(), {
self.performSegueWithIdentifier("segueLoginViewtoHome", sender: nil })
进入loginButton(),它永远不会真正执行(即,当Web浏览器消失时,用户将返回到具有登录按钮的视图,而不是segue预期的新视图)。我相信该行在浏览器窗口返回到包含登录按钮(和segue)的视图之前执行,但我不知道如何告诉程序“等待”视图成为唯一一个活动且再次可见的视图执行segue。
我相信是这种情况,因为如果我将相同的segue代码放入loginButtonDidLogOut(),那里不需要切换到浏览器,则在表单中按下“注销”之后,segue执行得很好从屏幕底部向上滑动。
此视图控制器已正确设置为委托,如下所示,如果编码在注销时发生,则segue正常运行。
任何帮助都会非常感激,为长期问题道歉,谢谢!
答案 0 :(得分: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
}
}
}
希望它有所帮助!
答案 1 :(得分:1)
就Facebook已经更新了他的Swift API而言,我发现这个很好的教程有助于最终触发到下一个屏幕的segue。
http://www.talkmobiledev.com/2016/12/24/facebook-sign-in-with-swift-3/
缺少的链接是我将segue类型设置为“Present Modally”。
答案 2 :(得分:0)
我没有足够的声誉来发表评论,但改变了你的“或”。比较器' ||'到AND'&&'当检查登录是否成功并且令牌没有为我工作时。否则,无论他们是否因某种原因登录,我都会陷入困境。可能只是我的问题,但希望有助于其他人。