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

Posted

技术标签:

【中文标题】Swift & Facebook 登录:我的 UIViewController 不符合 FBSDKLoginButtonDelegate【英文标题】:Swift & Facebook login : my UIViewController does not conform to FBSDKLoginButtonDelegate 【发布时间】:2015-05-18 22:35:05 【问题描述】:

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

所以,我遵循了这个教程: 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.


【问题讨论】:

教程真的很不错。我刚刚尝试使用 Facebook ios SDK 4.2.0,但无法重现。我建议更新,确保您已将 FBSDKCoreKit 和 FBSDKLoginKit 添加到您的桥接头,然后重试。 如果您按照教程中的所有说明进行操作,则不需要任何导入。您应该在桥接头文件中包含所有导入。您的委托方法也正确编写。我只是在一个工作项目中替换了它们,我没有收到任何错误。正如@corvuszero 建议的那样,尝试使用最新的 SDK。委托方法可能与您使用的版本不同,并且可能与示例不匹配。如果您出于任何原因仍想使用较旧的 SDK,请不要复制/粘贴委托方法,请使用自动完成或检查 FB 标头以了解确切的声明。 【参考方案1】:

先生,我刚刚解决了这个问题!你必须让你的 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")

【讨论】:

完美运行!实现部分很重要! 你是个天才。你刚刚让过去的 3 小时变得有价值。【参考方案2】:

只要实现这些方法就可以了

    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"]
    

【讨论】:

【参考方案3】:

将“func loginButton(...”和“func loginButtonDidLogOut(...”移出“override func viewDidLoad() ... ”。

【讨论】:

试着给你一些解释。【参考方案4】:

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

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

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) 
    

【讨论】:

【参考方案5】:

看来,对于最新的 Facebook SDK 4.x 版本、Xcode 9.0.1 和 Swift 4,您需要一个额外的功能才能使 LoginButtonDelegate 工作(如您所见,如果您单击 Delegate 协议然后使用 CTRL CMD J 跳转到它的定义):

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

【讨论】:

以上是关于Swift & Facebook 登录:我的 UIViewController 不符合 FBSDKLoginButtonDelegate的主要内容,如果未能解决你的问题,请参考以下文章

自定义 Facebook 登录视图 Swift

Swift - 立即解析 Facebook 登录默认为用户取消登录

取消 Facebook 登录不显示 (Swift)

迁移到 Swift 3 时,Facebook 登录不会返回应用程序

使用 Facebook 应用程序时 Facebook 登录回调不起作用 - Swift

Facebook 登录 Swift iOS 10 - 没有任何效果