【问题标题】:combined textfields result if all are not empty RxSwift如果全部都不为空,则组合文本字段结果 RxSwift
【发布时间】:2019-03-02 07:35:13
【问题描述】:

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

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

【问题讨论】:

  • 您只是要求进行代码审查还是遇到了问题?

标签: rx-swift rx-cocoa


【解决方案1】:

这也应该有效:

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)

【讨论】:

    【解决方案2】:

    已经找到答案了:

     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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      相关资源
      最近更新 更多