В текущей версии FacebookLogin (0.2.0) для Swift, делегат LoginButton свойство определяется как сильное свойство:
public class LoginButton: UIView {
...
/// Delegate of the login button that can handle the result, logout events.
public var delegate: LoginButtonDelegate?
... }
Если вы добавили логин кнопка Facebook, следуя инструкции и установить свой класс UIViewController
ребенка в качестве кнопки делегата ...
... ссылка цикл будет создан. В представлении будет содержаться сильная ссылка на кнопку, кнопка будет содержать сильную ссылку на контроллер, и контроллер будет иметь сильную ссылку на ее вид, см. Это post.
Мое решение было использовать слабую переменную-член, чтобы иметь ссылку на кнопку входа и, когда представление исчезает, кнопка делегат устанавливается на ноль, как это:
import UIKit
import FacebookCore
import FacebookLogin
import RxSwift
class LoginViewController: UIViewController, LoginButtonDelegate {
private weak var facebookLoginButton: LoginButton? = nil
override func viewDidLoad() {
super.viewDidLoad()
// Add the Facebook login button
let loginButton = LoginButton(readPermissions: [ .publicProfile, .email, .userFriends ])
loginButton.center = view.center
// WARNING!: Facebook login button delegate property is defined currently as STRONG.
// Therefore, it must be set to nil before leaving the view to avoid reference cycles
loginButton.delegate = self
view.addSubview(loginButton)
// Store the login button as a weak reference, since it is holded by the main view with a
// strong reference
facebookLoginButton = loginButton
}
override func willMove(toParentViewController parent: UIViewController?) {
super.willMove(toParentViewController:parent)
if parent == nil {
// The back button was pressed, interactive gesture used, or programatically pop view
// was executed
// Do not forget to set delegate in Facebook button to nil to break reference cycle.
facebookLoginButton?.delegate = nil
}
}
// MARK: - Facebook login
/**
Called when the button was used to login and the process finished.
- parameter loginButton: Button that was used to login.
- parameter result: The result of the login.
*/
func loginButtonDidCompleteLogin(_ loginButton: LoginButton, result: LoginResult) {
switch result {
case .failed(let error):
// Action on failed
case .cancelled:
// Action on cancelled
case .success(let grantedPermissions, let declinedPermissions, let accessToken):
// Action on success
}
}
/**
Called when the button was used to logout.
- parameter loginButton: Button that was used to logout.
*/
func loginButtonDidLogOut(_ loginButton: LoginButton) {
// Action on logout
}
}
Не используйте функцию viewWillDissapear()
для установки на nil
делегата, поскольку страница входа в Facebook будет отображаться поверх вашего приложения, запуская эту функцию, и вы не получите результат входа, так как вы больше не будете делегатом. Обратите внимание, что this solution отлично работает для просмотра внутри навигационного контроллера. Другое решение должно быть найдено для модальных окон.
Я надеюсь, что это помогает, Хави
Вы должны проверить для успеха обратного вызова (т.е. вход в = успех) в представлении. Если вы вошли в систему, вы можете «перенаправить» на другое представление. –
Это может быть глупый вопрос, но как я могу это сделать, поскольку в контроллере представления нет реального кода? – Soporificdreamer