使用RxSwift 实现登录页面的条件绑定

我们在使用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://www.cnblogs.com/lidarui/p/8192387.html