我试图使用代表调用函数,由于某种原因,它无法正常工作。我将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)
}
这可能会使您有一个想法如何处理。无论如何,您将不得不弄清楚什么是最适合自己的事业。如果您不使用依赖注入,我强烈建议您。