Swift和Facebook登录:我的UIViewController不符合FBSDKLoginButtonDelegate

即使Facebook教程说不需要标题,我也会在.swift文件中通过简单的导入框架添加FBSDKfunction时遇到问题。

所以,我遵循了这个教程: http : //www.brianjcoleman.com/tutorial-how-to-use-login-in-facebook-sdk-4-0-for-swift/使用swift 6.3 SDK Facebook 4.1 SDK

但我有两个问题

FBLoginViewViewController does not conform to FBSDKLoginButtonDelegate Cannot assign a value of type 'FBLoginViewViewController' to a value of type 'FBSDKLoginButtonDelegate!' 

所以我无法登录,我尝试删除import语句,没有变化,我也在appDelegate中实现了每个语句,一切都应该没问题,但仍然……

提前致谢

  // // FBLoginViewViewController.swift // SocialFBLogin // // Created by XXXX XXXX on 18/05/15. // Copyright (c) 2015 XXXX XXXX. All rights reserved. // import UIKit import FBSDKCoreKit import FBSDKShareKit import FBSDKLoginKit //@objc(FBLoginViewViewController) class FBLoginViewViewController: UIViewController, FBSDKLoginButtonDelegate { @IBOutlet weak var FBLoginPicture: UIImageView! @IBOutlet weak var FBLoginNameLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. if (FBSDKAccessToken.currentAccessToken() != nil) { // User is already logged in, do work such as go to next view controller. } else { let loginView : FBSDKLoginButton = FBSDKLoginButton() self.view.addSubview(loginView) loginView.center = self.view.center loginView.readPermissions = ["public_profile", "email", "user_friends"] loginView.delegate = self } // Facebook Delegate Methods func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { println("User Logged In") if ((error) != nil) { // Process error } else if result.isCancelled { // Handle cancellations } else { // If you ask for multiple permissions at once, you // should check if specific permissions missing if result.grantedPermissions.contains("email") { // Do work } } } func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { println("User Logged Out") } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

先生,我刚刚解决了这个问题! 你必须使你的viewController符合FBSDKLoginButtonDelegate。 首先,您将它添加到您的协议中,如下所示:

 class MainView: UIViewController, UITableViewDataSource, UITableViewDelegate, FBSDKLoginButtonDelegate { //Your Code } 

要符合此协议,您必须实现以下两种方法:

 func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { println("User Logged In") if ((error) != nil) { // Process error } else if result.isCancelled { // Handle cancellations } else { // If you ask for multiple permissions at once, you // should check if specific permissions missing if result.grantedPermissions.contains("email") { // Do work } } } func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { println("User Logged Out") } 

你只需复制这段代码就可以了!

更新为Swift 3

 func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) { print("User Logged In") if ((error) != nil) { // Process error } else if result.isCancelled { // Handle cancellations } else { // If you ask for multiple permissions at once, you // should check if specific permissions missing if result.grantedPermissions.contains("public_profile") { // Do work } } } func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) { print("User Logged Out") } 

通过实施这些方法,它起作用了

  func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { if (error == nil) { } else { println(error.localizedDescription) } } func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { println("User logged out...") } override func viewDidLoad() { super.viewDidLoad() if (FBSDKAccessToken.currentAccessToken() != nil) { println("User logged in...") } else { println("User not logged in...") } let fbLoginButton: FBSDKLoginButton! = FBSDKLoginButton() self.view.addSubview(fbLoginButton) fbLoginButton.delegate = self fbLoginButton.center = self.view.center fbLoginButton.readPermissions = ["public_profile", "email", "user_friends"] } 

将“ func loginButton(… ”和“ func loginButtonDidLogOut(… ”)移出“ 覆盖func viewDidLoad(){…} ”。

我发现方法和委托的名称已经改变

这是我的代码,如果它对某人有用

 import UIKit import FacebookCore import FacebookLogin class LoginViewController: UIViewController, LoginButtonDelegate { override func viewDidLoad() { super.viewDidLoad() let loginButton = LoginButton(readPermissions: [ .publicProfile ]) loginButton.center = view.center loginButton.delegate = self view.addSubview(loginButton) } // MARK: - LoginButtonDelegate func loginButtonDidCompleteLogin(_ loginButton: LoginButton, result: LoginResult) { } func loginButtonDidLogOut(_ loginButton: LoginButton) { } } 

看来,使用最新的Facebook SDK 4.x版本,Xcode 9.0.1和Swift 4,你需要一个额外的function让LoginButtonDelegate工作(你可以看到你点击代表协议然后使用CTRL CMD J跳转根据其定义):

  func loginButtonWillLogin(_ loginButton: FBSDKLoginButton) -> Bool{ return true }