提问者:小点点

使用Combine和Swiftui重置TextField值


当满足某个条件时,我尝试重置一个textfield(.count==4),但它不起作用,我遗漏了什么?

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)
    }
}

共2个答案

匿名用户

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

另外,请确保在接收器块中捕获[弱自体],以避免内存泄漏:

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

匿名用户

这是一个你不需要任何组合的情况。只需使用普通的didset来观察属性的更改:

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