Соответствие протоколу - добавление заглушек протокола снова и снова не устраняет ошибку
Итак, у меня есть класс 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...), которая уже реализована, и кажется, что она ее не распознает.
Я попытался очистить проект, удалить производные данные, перезапустить, но все равно он выдает мне ту же ошибку:
Тип "FBViewController" не соответствует протоколу "FBSDKLoginButtonDelegate"
Помощь оценена! Спасибо
2 ответа
Итак, после долгих поисков я нашел ответ на эту проблему, которая описана здесь
Я импортировал Turbolinks-ios, который имел свою собственную структуру Error, мне пришлось использовать Swift.Error в методе-заглушке -
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Swift.Error!) {...
Для других, кто, возможно, пришел сюда, чтобы иметь проблемы с делегатом класса от Cocoapod.
Итак, проблема, с которой я столкнулся, заключалась в добавлении протоколов
func photo(captured: UIImage?, currentStep: StepEnum) {
Но они всегда просили повторить, потому что проект cocoapod и мой проект имели одно и то же имя класса "StepEnum", чтобы исправить это, мне просто нужно было изменить имя моего класса, и это было разрешено.
Попробуйте удалить и переустановить модули, выполнив следующие действия:
Удалите все зависимости из вашего.podfile (или просто прокомментируйте, добавив #
в начале строки) беги pod install
в каталоге вашего проекта и в ожидании удаления всех удаленных модулей, повторно добавьте зависимости модулей и запустите pod install
Снова очистить ваш проект и построить снова
Плюс: иногда у меня возникали похожие проблемы, которые решались простым удалением необходимых функций, которые уже были реализованы, и пытались повторно добавлять их, используя автозаполнение кода Xcode.
Например, начните вводить метод, выберите право в списке автозаполнения (если не появляется, используйте ^+Space
) и нажмите ввод: образец