1

我是 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)

4

1 回答 1

-1

只需在设置文本后尝试 view.layoutIfNeeded()

于 2019-12-01T19:31:19.293 回答