ios - 组合框架更新 UI 无法正常工作

标签 ios swift combine

我想尝试Combine框架,用法很简单,按一个UIButton,然后更新UILabel

我的想法是:

  1. 添加发布商

@Published var cacheText:字符串?

  • 订阅
  • $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)
        }
    }
    

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

    最佳答案

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

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

    关于ios - 组合框架更新 UI 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63239813/

    相关文章:

    swift - Firebase 垃圾邮件购买报告日志

    swift - URL验证发布者

    swift - 如何让 Swift Coordinator 反射(reflect) parent 的绑定(bind)变化?

    swiftui - 如何将全局应用程序状态桥接到模型 View (使用@ObservedObject)?

    ios - NSManagedObject 共享实例

    ios - 为什么不支持在 iOS 上执行分段上传到 S3?

    ios - Flutter-带有搜索栏的自定义条形应用栏

    arrays - Swift:类数组的问题

    ios - 我应该如何重构我的自定义 UITableView 以提高可维护性

    ios - Swift(SpriteKit)/AdMob - 插页式广告请求错误