如果所有都不为空,则合并文本字段结果

时间:2019-03-02 07:35:13

标签: rx-swift rx-cocoa

我正在尝试合并所有文本字段的输入,并检查它是否具有输入,但是在观察时,合并的最新只订阅了一次。

还有其他方法可以使用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) 

2 个答案:

答案 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)