【问题标题】:Reset TextField value using Combine and Swiftui使用 Combine 和 Swiftui 重置 TextField 值
【发布时间】:2021-06-16 21:01:18
【问题描述】:

当满足某个条件 (.count == 4) 时,我尝试重置 TextField 值,但它不起作用,我错过了什么?

class ViewModel: ObservableObject {
    @Published var code = ""
    private var anyCancellable: AnyCancellable?
    init() {
        anyCancellable = $code.sink { (newVal) in
            if newVal.count == 4 {
                self.code = ""
            }
        }
    }
}
struct ContentView: View {
    
    @ObservedObject var viewModel = ViewModel()
    
    var body: some View {
        TextField("My code", text: $viewModel.code)
    }
}

【问题讨论】:

    标签: ios swiftui combine


    【解决方案1】:

    添加.receive(on: DispatchQueue.main) 似乎可以解决此问题,但是,我不确定为什么需要它。

    附带说明,请确保在 sink 块中捕获 [weak self] 以避免内存泄漏:

    anyCancellable = $code
                .receive(on: DispatchQueue.main) // <--
                .sink { [weak self] newVal in
                    if newVal.count == 4 {
                        self?.code = ""
                }
    

    【讨论】:

    • 这是必需的,因为code 必须在主线程上更改才能产生 UI 效果
    • @SorinLica,通过@Published 观察值的变化以重置它是不必要的。 didSet 语言支持开箱即用
    • 我同意@SorinLica 在这件事上。我觉得他们的回答更合适。
    【解决方案2】:

    这是一种不需要任何组合的情况。只需使用普通的didSet 来观察属性的变化:

    class ViewModel: ObservableObject {
        @Published var code = "" {
            didSet {
                if code.count == 4 {
                    self.code = ""
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 2020-02-24
      • 2020-06-10
      • 1970-01-01
      • 2021-11-06
      • 2021-08-21
      • 2021-01-17
      相关资源
      最近更新 更多