Соответствие протоколу - добавление заглушек протокола снова и снова не устраняет ошибку - PullRequest
0 голосов
/ 05 ноября 2018

Итак, у меня есть класс FBViewController, в котором должна отображаться кнопка входа и выхода (только для проверки входа в FB). Я интегрировал это во вновь созданный проект, и все работало. Затем я переделал его в свое приложение, и оно не работает. Не уверен, что это как-то связано с быстрой версией или с чем-то еще ... Используя Xcode 10.0

import UIKit
import FBSDKLoginKit

class FBViewController: UIViewController, FBSDKLoginButtonDelegate {


    override func viewDidLoad() {
        super.viewDidLoad()
        let btnFBLogin = FBSDKLoginButton()
        btnFBLogin.readPermissions = ["public_profile", "email"]
        btnFBLogin.delegate = self
        btnFBLogin.center = self.view.center
        self.view.addSubview(btnFBLogin)

        if FBSDKAccessToken.current() != nil{
            print("Logged IN ALREADY")
            printInfo()
        }else{
            print("not logged in")
        }

    }

    func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
        if error != nil{
            print(" error")
      //      print(error.localizedDescription)
        }else if result.isCancelled {
            print("User cancelled.")
        }
        else {
            print("Logge IN!")
            printInfo()
        }
    }

    func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) {
        print("logged out")
    }

    func printInfo(){


        if(FBSDKAccessToken.current() != nil){

            FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id,name , first_name, last_name , email"]).start(completionHandler: { (connection, result, error) in

                guard let Info = result as? [String: Any] else { return }

                if let userName = Info["name"] as? String
                {
                    print(userName)
                }

            })
        }
    }

}

FBSDKLoginButtonDelegate

/**
 @protocol
  A delegate for `FBSDKLoginButton`
 */
@protocol FBSDKLoginButtonDelegate <NSObject>

@required
/**
  Sent to the delegate when the button was used to login.
 @param loginButton the sender
 @param result The results of the login
 @param error The error (if any) from the login
 */
- (void)loginButton:(FBSDKLoginButton *)loginButton
didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result
                error:(NSError *)error;

/**
  Sent to the delegate when the button was used to logout.
 @param loginButton The button that was clicked.
*/
- (void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton;

@optional
/**
  Sent to the delegate when the button is about to login.
 @param loginButton the sender
 @return YES if the login should be allowed to proceed, NO otherwise
 */
- (BOOL) loginButtonWillLogin:(FBSDKLoginButton *)loginButton;

@end

Добавление заглушек протокола добавляет только 1 функцию (loginButton ...), которая уже реализована, и кажется, что она ее не распознает.

https://i.stack.imgur.com/O7EZ0.png

Я пытался очистить проект, удалить производные данные, перезапустить, но все равно он выдает мне ту же ошибку:

Тип 'FBViewController' не соответствует протоколу 'FBSDKLoginButtonDelegate'

Помощь приветствуется! Спасибо

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Так что после долгих поисков я нашел ответ на эту проблему, который описан здесь

Я импортировал Turbolinks-ios, который имел собственную структуру Error, мне пришлось использовать Swift.Error в методе-заглушке -

 func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Swift.Error!) {...
0 голосов
/ 05 ноября 2018

Попробуйте удалить и переустановить модули, выполнив следующие действия:

Удалите все зависимости из вашего .podfile (или просто прокомментируйте, добавив # в начале строки) Запустите pod install в каталоге вашего проекта и ожидайте удаления всех удаленных модулей. заново добавьте зависимости pods и снова запустите pod install Очистить свой проект и построить снова


Плюс: иногда у меня возникали похожие проблемы, которые решались простым удалением требуемых функций, которые уже были реализованы, и пытались повторно добавлять их, используя автозаполнение кода Xcode.

Например, начните вводить метод, выберите право в списке автозаполнения (если не появляется, используйте ^+Space) и нажмите ввод: образец

...