我有一个具有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的某种组合。
使单个使用自定义枚举的活页夹
enum Validation {
case valid
case minimumChars
case alphaNumeric
}
然后让每个验证器返回此枚举的值。然后合并两个验证器,并将结果映射到单个验证并绑定。
类似
Observable.combineLatest(minimumValidator, regexValidator) { v1, v2 in
// if v1 is not valid return it. Otherwise return v2
}