我正在尝试合并所有文本字段的输入,并检查它是否具有输入,但是在观察时,合并的最新只订阅了一次。
还有其他方法可以使用rxswift检查文本字段是否为空吗?那些OTP文本字段
let otp1Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp1.rx.text)
.map{ !$0!.isEmpty }
.share()
let otp2Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp2.rx.text)
.map{ !$0!.isEmpty }
.share()
let otp3Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp3.rx.text)
.map{ !$0!.isEmpty }
.share()
let otp4Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp4.rx.text)
.map{ !$0!.isEmpty }
.share()
let otp5Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp5.rx.text)
.map{ !$0!.isEmpty }
.share()
let otp6Value: Observable<Bool> = self.otp1.rx.controlEvent(UIControlEvents.editingDidEnd)
.withLatestFrom(self.otp6.rx.text)
.map{ !$0!.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)
答案 0 :(得分:0)
已经找到答案:
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 $0 && $1 })
}.subscribe(onNext: { [weak self] (valid: Bool) -> Void in
guard let self = self else { return }
self.step2CellViewModel.otpIsValid.value = valid
})
.disposed(by: self.disposeBag)
答案 1 :(得分:0)
这也应该起作用:
let textFields = [otp1, otp2, otp3, otp4, otp5, otp6]
Observable.combineLatest(textFields.map { $0!.rx.text.orEmpty })
.map { $0.map { $0.isEmpty } }
.map { !$0.contains(true) }
.bind(to: step2CellViewModel.otpIsValid)
.disposed(by: disposeBag)