Пользовательский интерфейс Combine Framework Update не работает должным образом - PullRequest
1 голос
/ 04 августа 2020

Я хочу попробовать Combine framework, очень простое использование, нажмите UIButton и обновите UILabel.

Моя идея:

  1. Добавить издателя

@Published var cacheText: String?

Подписаться

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

присваивает значение при нажатии кнопки.

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 Ответ

3 голосов
/ 04 августа 2020

Трубопровод умирает, прежде чем вы успеете нажать на кнопку. Вы должны сохранить это, например:

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