合并框架更新 UI 无法正常工作

Combine Framework Update UI doesn't work properly

我想试试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)
    }
}

不确定我是否遗漏了什么,感谢您的帮助。

您还没来得及点击按钮,管道就快死了。你必须像这样保存它:

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