Управление делегатом из класса UIViewController - PullRequest
0 голосов
/ 22 марта 2020

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

Как я могу управлять делегатом, используя параметр controller: UIViewController моей функции в AuthManager?

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

 class StartController: UIViewController {

    @objc private func presentAuthFacebookController() {
        AuthManager.signInWithFacebook(controller: self)
    }
}

class AuthManager {
static func signInWithFacebook(controller: UIViewController) {

    let loginManager = LoginManager()
    loginManager.logIn(permissions: [.publicProfile, .email], viewController: controller) { (result) in

        switch result {
        case .cancelled : print("\n AuthFacebook: operazione annullata dall'utente \n")
        case .failed(let error) : print("\n AuthFacebook: \(error) \n")
        case .success(granted: _, declined: let declinedPermission, token: _):


            let authVC = ExistingEmailController()

            authVC.delegate = // ?????? (controller)

            UIApplication.shared.windows.first?.rootViewController?.present(authVC, animated: true, completion: nil)
        }
    }
}
}

1 Ответ

1 голос
/ 22 марта 2020

Лично я не думаю, что StartController должен знать о / соответствовать ExistingEmailControllerDelegate. Но если вы действительно хотите, вы можете объявить controller как тип композиции:

static func signInWithFacebook(controller: UIViewController & ExistingEmailControllerDelegate) {
    ...
    authVC.delegate = controller

На мой взгляд, весь смысл наличия AuthManager состоит в создании слоя абстракции поверх ExistingEmailController, а инкапсулирует логи c аутентификации. Следовательно, StartController не должен знать или заботиться о ExistingEmailControllerDelegate. Он знает только о AuthManager.

AuthManager должен быть делегатом ExistingEmailController, что означает, что signInWithFacebook не должно быть stati c, а AuthManager может иметь AuthManagerDelegate, что StartController соответствует:

class AuthManager : ExistingEmailControllerDelegate {
    weak var delegate: AuthManagerDelegate?

    func signInWithFacebook(controller: UIViewController) {

        ...

        let authVC = ExistingEmailController()

        authVC.delegate = self

        UIApplication.shared.windows.first?.rootViewController?.present(authVC, animated: true, completion: nil)
    }

    func someMethodFromExistingEmailControllerDelegate() {
        delegate?.someMethod() // delegating it self.delegate, which StartController conforms to
    }
}

protocol AuthManagerDelegate : class {
    func someMethod()
}

 class StartController: UIViewController, AuthManagerDelegate {

    var authManager: AuthManager!

    override func viewDidLoad() {
        authManager = AuthManager()
        authManager.delegate = self
    }

    @objc private func presentAuthFacebookController() {
        authManager.signInWithFacebook(controller: self)
    }

    func someMethod() {
        // write here the code that you would have written in someMethodFromExistingEmailControllerDelegate
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...