Подтвердить что ты не робот

Вход Swift & Facebook: мой UIViewController не соответствует FBSDKLoginButtonDelegate

Даже если в учебнике Facebook говорится, что нет необходимости в заголовке, у меня были проблемы при добавлении функций FBSDK через простую инфраструктуру импорта в файлах .swift.

Итак, я последовал этому руководству: 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!'

поэтому я не могу войти в систему, я попытался удалить операторы импорта, никаких изменений, я также внедрил каждый оператор в 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.
}
}
4b9b3361

Ответ 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")
}

Ответ 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 (..." из " переопределить 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 (так как вы можете увидеть, хотите ли вы щелкнуть по протоколу делегата, а затем использовать CTRL CMD J, чтобы перейти к его определению):

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