微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RXSwift 中的 if else 条件

如何解决RXSwift 中的 if else 条件

一个使用 RXSwift 进行验证的文本字段。我想禁用基于 switch 操作的验证。

 // Start Time
 startTimeValid = startTimeTextfield.rx.text.orEmpty.map{
            $0.count > 0
  }

 // End time
 endTimeValid = endTimeTextfield.rx.text.orEmpty.map{
            $0.count > 0
 }

 everythingValid = Observable.combineLatest(startTimeValid,endTimeValid){ $0 && $1 }
        

 endTimeValid.bind(to: endTimeErrorLabel.rx.isHidden).disposed(by: bag)
 startTimeValid.bind(to: startTimeErrorLabel.rx.isHidden).disposed(by: bag)
 everythingValid.bind(to: createButton.rx.isEnabled).disposed(by: bag)

        
 createButton.rx.tap.subscribe(onNext:{

            print("success")

        }).disposed(by: bag)

所以在上面的代码结束时间和开始时间文本字段都被验证。基于布尔值,我需要禁用 EndTime 文本字段的验证。

我试过的代码

 @objc func endDaterequired(_ aSwitch : UISwitch){

        
        if aSwitch.isOn{

            everythingValid = Observable.combineLatest(eventTitleValid,startDateValid,endDateValid){ $0 && $1 && $2
            }
            everythingValid.bind(to: createButton.rx.isEnabled).disposed(by: bag)
       
        }else{
            
            everythingValid = Observable.combineLatest(eventTitleValid,endDateValid,startTimeValid,endTimeValid){ $0 && $1 && $2 && $3 && $4
            }
            everythingValid.bind(to: createButton.rx.isEnabled).disposed(by: bag)

        }
        
    }

我正在尝试以反应式的方式简化它。

解决方法

@matt 有正确的答案,但 RxSwift 中的解决方案更简单,因为全局 combineLatest 运算符最多可以接受 8 个参数......

Observable.combineLatest(
    startTimeTextField.rx.text.orEmpty,endTimeTextField.rx.text.orEmpty,endDateRequired.rx.isOn
)
{ startTime,endTime,endDateRequired in
    !startTime.isEmpty && (!endTime.isEmpty || !endDateRequired)
}
.bind(to: createButton.rx.isEnabled)
.disposed(by: disposeBag)
,

我不知道 RxSwift,但我可以看到问题在于像 if aSwitch.isOn 这样的行不是响应式的。您还需要观察开关,并考虑所有的值。

这是一个 Combine 示例,它无疑以某种简单的方式转化为 RxSwift。我们有两个文本字段、一个开关和一个按钮。仅当两个文本字段都有内容时才启用按钮,除非开关关闭,在这种情况下,按钮只是随意启用(无验证):

class ViewController: UIViewController {
    @IBOutlet weak var tf1: UITextField!
    @IBOutlet weak var tf2: UITextField!
    @IBOutlet weak var sw: UISwitch!
    @IBOutlet weak var button: UIButton!
    var storage = Set<AnyCancellable>()
    override func viewDidLoad() {
        super.viewDidLoad()
        let tfpub1 = tf1.publisher(for:.editingChanged)
            .map {$0.text ?? ""}
            .prepend("")
        let tfpub2 = tf2.publisher(for:.editingChanged)
            .map {$0.text ?? ""}
            .prepend("")
        let swpub = sw.publisher()
            .map {$0.isOn}
            .prepend(true)
        tfpub1.combineLatest(tfpub2,swpub)
            .map { !$2 || ( $0.count > 0 && $1.count > 0 ) }
            .assign(to: \.isEnabled,on: self.button)
            .store(in: &storage)
    }
}

对于 UIControl publisher 方法,请参阅我的 https://www.apeth.com/UnderstandingCombine/publishers/publisherscustom.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。