ios - RxSwift 上有某种优先级运算符吗?
问题描述
我有一个文本字段,它有 2 条验证规则:最少数量的字符和字母数字字符。
我希望能够在错误标签中向用户表示他做错了什么,但问题是,如果我将文本字段绑定到两个规则,它可能会令人毛骨悚然,因为一旦一个规则获得批准,ui 的颜色就会有点闪烁例如,由于其他验证失败,分隔符从红色变为绿色再变为红色。
我想知道是否有办法将一个绑定优先于另一个绑定。例如,这是我目前拥有的:
let minimumValidator
= inputField.textField
.rx.text.orEmpty.map { $0.count >= 8 } // Min amount of chars is 8
minimumValidator.bind(to: inputField.rx.minimumChars)
.disposed(by: bag)
let regexValidator
= inputField.textField
.rx.text.orEmpty.map { $0.matches(regex) }
regexValidator.bind(to: inputField.rx.regex)
.disposed(by: bag)
rx.minimumChars 和 rx.regex 是自定义绑定器
var minimumChars: Binder<Bool> {
return Binder(self.base) { control, value in
UIView.animate(withDuration: 0.1) {
if value {
control.separator.backgroundColor = .white
control.errorLabel.isHidden = true
} else {
let error = "Needs more characters"
control.separator.backgroundColor = .red
control.errorLabel.text = error
control.errorLabel.isHidden = false
}
}
}
}
所以我的想法是优先考虑 idk ......让我们说字母数字验证 - 所以它会显示从最小字符到出现字母数字错误的错误,所以在用户解决字母数字验证之前,它会忽略来自最小数量的字符的其他流。我很确定我错过了 combineLatest 与 merge 或 idk 的组合。
解决方案
制作使用自定义枚举的单个 Binder
enum Validation {
case valid
case minimumChars
case alphaNumeric
}
然后让每个验证器返回这个枚举的值。然后 combineLatest 两个验证器并将结果映射到单个 Validation 并绑定。
就像是
Observable.combineLatest(minimumValidator, regexValidator) { v1, v2 in
// if v1 is not valid return it. Otherwise return v2
}
推荐阅读
- laravel - 如何获取特定型号的视频?
- php - 从网页中提取版本信息的查询
- c++ - a.exe:文件无法识别:文件被截断
- java - 春季启动查询,这有什么问题?
- jquery - 将fancybox 1 迁移到fancybox 3
- kotlin - 我们可以使用 Kotlin 接口实现类似 Rust 的 Traits
- python - HOG + SVM 实现找不到正确数量的人脸
- r - 如何合并股票价格?
- python - Selenium:看起来不同的 Google 登录页面
- ios - Swift:无法在 SplitViewController 中调整 collectionViewCells 的大小