使用 Combine 和 Swiftui 重置 TextField 值
Reset TextField value using Combine and Swiftui
我尝试在满足特定条件时重置 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)
}
}
添加 .receive(on: DispatchQueue.main)
似乎可以解决这个问题,但是,我不完全确定为什么需要它。
附带说明,确保在接收器块中捕获 [weak self] 以避免内存泄漏:
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 = ""
}
}
}
}
我尝试在满足特定条件时重置 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)
}
}
添加 .receive(on: DispatchQueue.main)
似乎可以解决这个问题,但是,我不完全确定为什么需要它。
附带说明,确保在接收器块中捕获 [weak self] 以避免内存泄漏:
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 = ""
}
}
}
}