合并框架更新用户界面无法正常运行

时间:2020-08-04 03:27:19

标签: ios swift combine

我想尝试Combine框架,非常简单的用法,按UIButton,然后更新UILabel

我的想法是:

  1. 添加发布者

@Published var cacheText: String?

  1. 订阅

$cacheText.assign(to: \.text, on: cacheLabel)

  1. 按下按钮时分配一个值。

cacheText = "testString"

然后应该更新标签的文本。

问题是当按下按钮时,@Published的值被更新,但是UILabel的值没有改变。 例如,最初为cacheLabel1分配了123,但按下按钮时没有分配789

这是完整的代码:

ViewModel.swift

import Foundation
import Combine

class ViewModel {
    @Published var cacheText: String?

    func setup(_ text: String) {
        cacheText = text
    }

    init() {
        setup("123")
    }
}

ViewController.swift

  class ViewController: UIViewController {
    @IBOutlet weak var cacheLabel: UILabel!

    var viewModel = ViewModel()

    @IBAction func buttonPressed(_ sender: Any) {
        viewModel.setup("789")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        viewModel.$cacheText.assign(to: \.text, on: cacheLabel)
    }
}

不确定我是否错过了什么,谢谢您的帮助。

1 个答案:

答案 0 :(得分:3)

在您没有机会点击按钮之前,管道即将消亡。您必须像这样保存它:

var storage = Set<AnyCancellable>()
override func viewDidLoad() {
    super.viewDidLoad()
    viewModel.$cacheText.assign(to: \.text, on: cacheLabel).store(in: &storage)
}