如果所有内容都不为空,则合并文本字段结果 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)