我是 VIPER 的新手,我在该架构中构建了最简单的演示,但是我遇到了麻烦,因为 View/View Controller 中的 UILabel 没有更新。这是相关代码:查看:
override func viewDidLoad() {
super.viewDidLoad()
presenter?.updateView()
}
主持人:
func updateView() {
interactor?.getText()
}
交互者:
func getText() {
presenter?.gotText(text: "Hello Viper")
}
主持人:
func gotText(text: String) {
view?.updateLabel(text: text)
}
看法:
func updateLabel (text: String) {
print(text)
helloLabel.text = text
}
print(text) 返回值,但视图本身没有更新。
我尝试在主线程上进行更新,但没有运气。我见过一些具有类似模式的项目(在 ViewController /label/backgroundColor 等中更新视图),但我无法弄清楚我的代码有什么问题。
该示例在 GitHub https://github.com/veliborsantic/VIPER-simple-example上可用 。类似的项目在https://github.com/smalam119/live-news-viper上可用,它按预期运行。
编辑 1: 我意识到 viewDidLoad 函数被调用了两次。我在 viewDidLoad() 和 updateLabel (text: String) 中都设置了打印消息,如下所示:
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad: ", helloLabel.text!)
presenter?.updateView()
}
func updateLabel (text: String) {
helloLabel.text = text
print("updateLabel: ", helloLabel.text!)
}
Outputs:
viewDidLoad:
updateLabel: Hello Viper
viewDidLoad:
如果我在 AppDelegate 中删除 initialViewController 的配置,viewDidLoad 会调用一次,但不会加载模块。
编辑 2 / 已解决 经过研究,我必须做 3 件事:告诉我不想通过情节提要初始化控制器,所以:1.关闭“是初始视图控制器”2.在部署信息中分离 Main 和 3.所有代码来自AppDelegate 移动到 func scene 中的 Scene Delegate(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)