Swift协议不起作用

时间:2017-11-25 05:21:26

标签: ios swift protocols

我正在尝试使用委托调用函数,并且由于某种原因它无法正常工作。我在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)
}

1 个答案:

答案 0 :(得分:0)

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

为您的演示者创建采用视图协议的init方法,这适用于两种方法:

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

注册您的依赖项

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

即使您没有使用故事板,也无法向演示者和演示者注入两个视图以在init中查看。这就是我在这里使用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)
}

这可以让你知道如何处理。无论如何,你必须弄清楚什么是你的事业最好的。如果你没有使用依赖注入,我强烈推荐它。