我正在尝试使用委托调用函数,并且由于某种原因它无法正常工作。我在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)
}
答案 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)
}
这可以让你知道如何处理。无论如何,你必须弄清楚什么是你的事业最好的。如果你没有使用依赖注入,我强烈推荐它。