我们在使用MVC建构进行开发时,对登录页面用户名密码等进行的处理一般是这样的,点击登录按钮判断用户框以及密码框输入的合法性,用一堆if真是屎一般!或者用textfield的代理来进行响应其实也是屎一般!
有了RxSwift,我们的响应式又多了一种可能!
let usernameValid = user_nameTextField.rx.text .map{($0?.characters.count)! >= minUsernameLength && ($0?.characters.count)! <= maxUsernameLength } //map函数 对text进行处理 .shareReplay(1) let passwordValid = secertTextFiled.rx.text .map{($0?.characters.count)! >= minPasswordLength && ($0?.characters.count)! < maxPasswordLength } //map函数 对text进行处理 .shareReplay(1) // let everythingValid = Observable.combineLatest(usernameValid, passwordValid) { (usernameValid, passwordValid) -> Bool in usernameValid && passwordValid } usernameValid .bindTo(usernameLabel.rx.isHidden) //username通过验证,usernameLB警告消失 .addDisposableTo(disposBag) passwordValid .bindTo(secertLable.rx.isHidden) .addDisposableTo(disposBag) usernameValid .bind(to: secertTextFiled.rx.isEnabled) //username通过验证,passwordTF才可以输入 .addDisposableTo(disposBag) everythingValid .bind(to: loginbtn.rx.isEnabled) // 用户名密码都通过验证,才可以点击按钮 .addDisposableTo(disposBag) everythingValid.bind { [weak self](isenabled) in if isenabled{ self?.loginbtn.backgroundColor = .red }else{ self?.loginbtn.backgroundColor = .gray } }.addDisposableTo(disposBag) loginbtn.rx.tap //绑定button点击事件 .bind { [weak self] in self?.showAlert() } .addDisposableTo(disposBag)
以上代码很好理解,我们用到了shareReply来共享监听,避免会创建多个序列去执行输入框的监听
![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1550046869549&di=1aa101a28a6f956ce63931a66bb2ecb4&imgtype=0&src=http%3A%2F%2Fwx3.sinaimg.cn%2Forj360%2F90f58663gy1fg6xj7eo85j20yg0yg4be.jpg)