gpt4 book ai didi

ios - Swift 协议(protocol)不起作用

转载 作者:行者123 更新时间:2023-11-30 11:58:51 26 4
gpt4 key购买 nike

我试图使用委托(delegate)调用一个函数,但由于某种原因它不起作用。我在 LoginPresenter init() 中将 loginPresenter 设置为 self,但它仍然不起作用。我不确定还可以尝试什么?我是否错过了代表的工作方式?

登录 View

class LoginView: UIViewController {

var loginPresenter: LoginPresenterProtocol?

override func viewDidLoad() {
super.viewDidLoad()


}

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

登录演示者 View

class LoginPresenter: LoginPresenterProtocol {
weak var view: LoginViewProtocol?

init() {
view?.loginPresenter = self
}

func loginUser(username: String, password: String) {
print("recieved")
}
}

协议(protocol)

protocol LoginViewProtocol: class {
var loginPresenter: LoginPresenterProtocol? { get set }
}

protocol LoginPresenterProtocol: class {
var view: LoginViewProtocol? { get set }

func loginUser(username: String, password: String)
}

最佳答案

问题的根源是您可能没有将演示者注入(inject)到 View 中,或者它不是同一个实例。我不知道你如何处理初始化,所以我提供2个概念。我猜最好使用 Viper 进行注入(inject)。

为您的演示者创建采用 View 协议(protocol)的 init 方法,这适用于两种方法:

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

注册您的依赖项

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

即使您不使用 Storyboard ,您也无法将 View 注入(inject)演示者并注入(inject)演示者以在 init 中查看。这就是我在这里使用 init Completed 的原因。

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)!
)
}

然后只需在需要呈现时解析 View Controller 即可。

没有依赖注入(inject)

或者,如果您不想处理依赖项注入(inject):

viewDidLoad中:

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

这可以让您了解如何处理这个问题。无论如何,你必须弄清楚什么对你的事业最有利。如果您不使用依赖注入(inject),我强烈推荐它。

关于ios - Swift 协议(protocol)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47482873/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com