我正在学习RxSwift和RxCocoa。 我遇到了这个问题:
我有UITextField和UIPickerView和UIButton。 UITextField有效后,应启用UIButton。从UIPickerView中选择的每个项目都有不同的验证正则表达式。
到目前为止,这是我的代码:
textField.rx.text
.map({ (text) -> Bool in
return self.validate(text!, self.regex)})
.subscribe(onNext: { (valid) in
self.button.alpha = valid ? 1 : 0.5
self.button.isEnabled = valid
})
.disposed(by: disposeBag)
pickerView.rx.itemSelected.subscribe(onNext: { row, value in
self.regex = getRegex(row)
}).disposed(by: disposeBag)
所以我先从pickerView中选择正则表达式,然后观察文本更改。当我想先输入文本,然后从pickerView中选择一些不同的正则表达式时,会出现问题-该按钮不会更新,不会对文本进行任何更改!
所以我想我应该以某种方式压缩或合并这两个源(可观察到的?),以便该按钮可以一次观察到每个源的任何变化。
我应该如何解决这个问题?
答案 0 :(得分:1)
您是否搜索过CombineLatest函数?
我认为它将解决您的问题
您可以通过以下博客了解它:http://adamborek.com/combinelatest-withlatestfrom-zip/
答案 1 :(得分:1)
好的,我有点解决了(使用Abdorahman中提到的CombineLatest)。 我将其发布给其他正在寻找类似内容的人:
let pickObs = pickerView.rx.itemSelected.map { (row, component) -> String? in
return getRegex(row)
}
Observable.combineLatest(textField.rx.text, pickObs.startWith("♂️")){ text, regex -> Bool in
return self.validate(text, regex)
}.subscribe(onNext: { (valid) in
self.addNewDevice.alpha = valid ? 1 : 0.5
self.addNewDevice.isEnabled = valid
}).disposed(by: disposeBag)
pickObs.startWith(“ ♂️”)在那里,因为我找不到预选择pickerView的方法。 (pickerView.selectRow并未触发pickerView.rx.itemSelected代码块。