ios - Rx swift : Complex TextFields Validation

标签 ios swift rx-swift

我是 RxSwift 的新手我发现的所有示例都在处理简单的案例。

我正在尝试对我的文本字段进行表单验证。 我的自定义 TextField 类有一个方法 isValid()和一个 regexp . isValid返回基于 regexp属性。

到目前为止,我已经写了以下内容:

let valids = [mLastName, mFirstName, mEmailField].map {
    $0.rx.text.map {
        text -> Bool in
        // I want more complex logic here
        // Like return field.isValid()
        return text!.characters.count > 0
    }
}    

let _ = Observable.combineLatest(valids) { iterator -> Bool in
    return iterator.reduce(true, { $0 && $1 })
}.subscribe(onNext: { allValid in
    ///update button according to AllValid
})

有谁知道如何更新代码以第一个 Observable<Bool> 为基础基于我的isValid()方法而不是 text!.characters.count

最佳答案

可能有很多方法可以做到这一点。

您可以在自定义 TextField 类中使用 filter 转换 rx.text Observable:

var isTextValid: Observable<Bool> {
    return rx.text.filter { _ in 
        return self.isValid()
    }
}

然后您可以将所有文本字段中的 isTextValidcombineLatest 组合。


您还可以从自定义文本字段中提取验证逻辑(也许您根本不需要自定义文本字段)。

好处:

  • 验证可以更容易进行单元测试
  • 您可以轻松地在应用的不同位置重复使用验证(例如,如果您曾经使用过 UITextView)。

验证器类的草案:

class TextValidator {
    var input: Observable<String>
    var regex: NSRegularExpression

    init(input: Observable<String>, regex: NSRegularExpression) {
       self.input = input
       self.regex = regex
    }

    func validate() -> Observable<Bool> {
        return input.map { text in 
             //return true if regex matches the text
        }
    }       
}

然后你可以像下面这样使用它:

let mailValidator = TextValidator(input: mLastName.rx.text, regex: /* actual regex*/)
let firstNameValidator = TextValidator(input: mFirstName.rx.text, regex: ...)



let _ = Observable.combineLatest(mailValidator.validate(), firstName.validate(), ...) 
// and so on

现在如果你想为验证器编写单元测试(你可能应该这样做),你可以简单地将 Observable.just("Some value") 作为 inputTextValidator 并验证 validate() 返回的 Observable 做了什么。

关于ios - Rx swift : Complex TextFields Validation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42860384/

相关文章:

ios - 如何使用SDWebImage在cgcontext中绘制图像

ios - 隐藏 View 并应用隐藏效果 - Swift

ios - 输入文字后无法按回车键

ios - 如何在 MKMapView 中添加不同的图像而不是图钉?

ios - iOS崩溃GameObject::IsActive()const

ios - 水平设置标签的自动布局约束

swift - 度数值的 NSNumberFormatter

swift - 我的 prepareForSegue() 方法不起作用

swift - 为自定义 UIControl 创建 ControlProperty

swift - Rx swift : how to get rid of callback hells of subscribe events and network request?