快速协议不起作用



我试图使用代表调用函数,由于某种原因,它无法正常工作。我将loginPresenter设置为LoginPresenter init()中的自我,但它仍然无法使用。我不确定还要尝试什么?我想念代表的工作方式吗?

登录视图

class LoginView: UIViewController {
    var loginPresenter: LoginPresenterProtocol?
    override func viewDidLoad() {
        super.viewDidLoad()

    }
    @objc func loginHandler() {
        print("Tapped")
        loginPresenter?.loginUser(username: "username", password: "123456")
    }
}

登录主持人视图

class LoginPresenter: LoginPresenterProtocol {
    weak var view: LoginViewProtocol?
    init() {
       view?.loginPresenter = self
    }
    func loginUser(username: String, password: String) {
        print("recieved")
    }
}

协议

protocol LoginViewProtocol: class {
    var loginPresenter: LoginPresenterProtocol? { get set }
}
protocol LoginPresenterProtocol: class {
    var view: LoginViewProtocol? { get set }
    func loginUser(username: String, password: String)
}

问题的根源是您可能没有将演示者注入视图,或者不是同一实例。我不知道您如何处理初始化,所以我提供了两个概念。我猜最好用毒蛇注射。

为您的主持人创建初始方法,该方法采用了视图协议,这适用于两种方法:

init(view: LoginViewProtocol) {
    self.view = view
}

注册依赖项

以下是使用Swinject对我有用的示例(已转换为您的原因,但未经过测试)。

即使您不使用故事板,也无法将视图注入主持人和主持人以在Init中查看。这就是为什么我在此处完成启动。

let mainStoryboard = UIStoryboard.init(name: "Main", bundle: nil)
container.register(LoginViewProtocol.self) { _ in
    mainStoryboard.instantiateViewController(
        withIdentifier: String(describing: LoginView.self)
    ) as! LoginViewProtocol
}.initCompleted { (r, loginVC) in
    loginVC.presenter: r.resolve(LoginPresenterProtocol.self)!
}
container.register(LoginPresenterProtocol.self) { r in
    LoginPresenter(
        view: r.resolve(LoginViewProtocol.self)!
    )
}

然后只需在需要时解决视图控制器。

没有依赖注入

,或者如果您不想处理依赖注入:

viewDidLoad中:

override func viewDidLoad() {
    super.viewDidLoad()
    presenter = LoginPresenter(view: self)
}

这可能会使您有一个想法如何处理。无论如何,您将不得不弄清楚什么是最适合自己的事业。如果您不使用依赖注入,我强烈建议您。

最新更新