Combine Framework Update UI doesn't work properly

Wil*_* Hu 2 ios swift combine

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

我的想法是:

  1. 添加发布者

@Published var cacheText: String?

  1. 订阅

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

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

cacheText = "testString"

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

问题是当按下按钮时,@Published值会更新,但UILabel值不会改变。例如,最初cacheLabel1已分配,但按下按钮时未分配。123789

这是完整的代码:

ViewModel.swift

import Foundation
import Combine

class ViewModel {
    @Published var cacheText: String?

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

    init() {
        setup("123")
    }
}
Run Code Online (Sandbox Code Playgroud)

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

mat*_*att 5

在你有机会点击按钮之前,管道就已经死了。你必须保存它,如下所示:

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