如果所有内容都不为空,则合并文本字段结果 RxSwift
combined textfields result if all are not empty RxSwift
我正在尝试合并所有文本字段的输入并检查它是否有输入,但在观察合并最新时只订阅了一次。
有没有其他方法可以使用 rxswift 检查文本字段是否为空?那些 OTP 文本字段
let otp1Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp1.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
let otp2Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp2.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
let otp3Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp3.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
let otp4Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp4.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
let otp5Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp5.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
let otp6Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp6.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
Observable.combineLatest(
otp1Value.asObservable(),
otp2Value.asObservable(),
otp3Value.asObservable(),
otp4Value.asObservable(),
otp5Value.asObservable(),
otp6Value.asObservable())
.asObservable().subscribe(onNext: { [weak self] (arg: (Bool, Bool, Bool, Bool, Bool, Bool)) -> Void in
guard let self = self else { return }
print("args \(arg)")
switch arg {
case (true, true, true, true, true, true):
self.step2CellViewModel.otpIsValid.onNext(true)
print("args \(arg)")
default:
self.step2CellViewModel.otpIsValid.onNext(false)
print("args false")
}
})
.disposed(by: self.disposeBag)
已经找到答案:
let valids: [Observable<Bool>] = [
self.otp1, self.otp2,
self.otp3, self.otp4,
self.otp5, self.otp6
].map { field in
field.rx.text.map({ _ in return !(field.text?.isEmpty)! })
}
_ = Observable.combineLatest(valids) { iterator -> Bool in
return iterator.reduce(true, { return [=10=] && })
}.subscribe(onNext: { [weak self] (valid: Bool) -> Void in
guard let self = self else { return }
self.step2CellViewModel.otpIsValid.value = valid
})
.disposed(by: self.disposeBag)
这也应该有效:
let textFields = [otp1, otp2, otp3, otp4, otp5, otp6]
Observable.combineLatest(textFields.map { [=10=]!.rx.text.orEmpty })
.map { [=10=].map { [=10=].isEmpty } }
.map { ![=10=].contains(true) }
.bind(to: step2CellViewModel.otpIsValid)
.disposed(by: disposeBag)
我正在尝试合并所有文本字段的输入并检查它是否有输入,但在观察合并最新时只订阅了一次。
有没有其他方法可以使用 rxswift 检查文本字段是否为空?那些 OTP 文本字段
let otp1Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp1.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
let otp2Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp2.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
let otp3Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp3.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
let otp4Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp4.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
let otp5Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp5.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
let otp6Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp6.rx.text)
.map{ ![=10=]!.isEmpty }
.share()
Observable.combineLatest(
otp1Value.asObservable(),
otp2Value.asObservable(),
otp3Value.asObservable(),
otp4Value.asObservable(),
otp5Value.asObservable(),
otp6Value.asObservable())
.asObservable().subscribe(onNext: { [weak self] (arg: (Bool, Bool, Bool, Bool, Bool, Bool)) -> Void in
guard let self = self else { return }
print("args \(arg)")
switch arg {
case (true, true, true, true, true, true):
self.step2CellViewModel.otpIsValid.onNext(true)
print("args \(arg)")
default:
self.step2CellViewModel.otpIsValid.onNext(false)
print("args false")
}
})
.disposed(by: self.disposeBag)
已经找到答案:
let valids: [Observable<Bool>] = [
self.otp1, self.otp2,
self.otp3, self.otp4,
self.otp5, self.otp6
].map { field in
field.rx.text.map({ _ in return !(field.text?.isEmpty)! })
}
_ = Observable.combineLatest(valids) { iterator -> Bool in
return iterator.reduce(true, { return [=10=] && })
}.subscribe(onNext: { [weak self] (valid: Bool) -> Void in
guard let self = self else { return }
self.step2CellViewModel.otpIsValid.value = valid
})
.disposed(by: self.disposeBag)
这也应该有效:
let textFields = [otp1, otp2, otp3, otp4, otp5, otp6]
Observable.combineLatest(textFields.map { [=10=]!.rx.text.orEmpty })
.map { [=10=].map { [=10=].isEmpty } }
.map { ![=10=].contains(true) }
.bind(to: step2CellViewModel.otpIsValid)
.disposed(by: disposeBag)