RXSwift--登录注册那点事

在iOS学习中登录注册是一个万能的可以拿出来实战的demo。接下来我们就从登录开始入手,PS:如果你对RXSwift中的概念和一些常用的函数不清楚可以参考这篇文章(可能打开比较慢请耐心等待)。开始直接上代码。先看一下我们要实现的效果。

loginGif.gif
loginGif.gif

分析实现:
1.在还没有输入的时候,显示提醒信息
2.输入账号和密码正确的时候隐藏提示信息
2.在账号和密码都输入的时候登录按钮可以点击

1.直接在storyBoard中创建简单的登录界面

简单的登录界面
简单的登录界面

关联好对应的属性,接下来引入我们今天的重点对象

import RxSwift
import RxCocoa

 

创建一个disposeBag来盛放我们需要管理的资源,然后把新建的监听都放进去,会在适当的时候销毁这些资源。

let disposeBag = DisposeBag()

接下来开始对事件的判断和绑定事件

        //判断账号的输入是否可用
        let accountValid:Observable = accountField.rx.text.orEmpty.map{ value in
            return value.characters.count >= 6
        }
        //判断密码的输入是否可用
        let passwordValid:Observable = passwordField.rx.text.orEmpty.map{ value in
            return value.characters.count >= 6
        }

上面orEmpty是判断当前字符串是否为空的,在RXSwift中已经处理了为nil的情况,map函数是在事件流转换的时候,重新生成另一个事件流,在这里是把一个文字事件流映射成一个bool事件流,accountValidpasswordValid都是Observable<Bool>类型

对于账号和密码输入正确与否的一个显示

      //账号密码输入的正确与否 绑定到infoLabel的hidden属性上
      //绑定显示
      accountValid.bind(to: accountInfoLabel.rx.isHidden).addDisposableTo(disposeBag)
      passwordValid.bind(to: passwordInfoLabel.rx.isHidden).addDisposableTo(disposeBag)

 

接着就是对于登录按钮的是否可点击的绑定

//登录按钮的可用与否
        let loginObserver = Observable.combineLatest(accountValid,passwordValid){(account,password) in
            account && password
        }
        //绑定按钮
        loginObserver.bind(to: loginBtn.rx.isEnabled).addDisposableTo(disposeBag)
        loginObserver.subscribe(onNext: { [unowned self] valid in
            self.loginBtn.alpha = valid ? 1 : 0.5
        }).disposed(by: disposeBag)

上面的将账号和密码输入的值与按钮的enable属性相关联,当accountValidtrue,并且passwordValid也为true时,按钮才可点击,同时也修改了按钮的透明度变化

接下来就是按钮点击事件的判断以及对应的方法的执行

loginBtn.rx.tap
            .asObservable()
            .withLatestFrom(loginObserver)
            .do(onNext: {
                [unowned self]_ in
                self.loginBtn.isEnabled = false
                self.view.endEditing(true)
            })
            .subscribeOn(MainScheduler.instance)//主线程
            .subscribe(onNext: {[unowned self]isLogin in
                self.showAlert(message: "开始点击")
                self.loginBtn.isEnabled = true
            })
            .addDisposableTo(disposeBag)//开始释放

按钮的点击事件中绑定的是loginObserver最新的一个流操作,do(onNext)函数是在执行之前对按钮的一个限定,比如网络请求延迟,按钮点击多次,我在按钮第一次点击的时候,就禁用按钮,等到网络请求成功或者失败返回信息的时候再修改按钮可点击的状态,.subscribeOn函数是指定事件流在那个线程中执行,这里指定的是主线程。subscribe(onNext…………这是点击按钮之后执行方法的闭包。 简写也可以写成这个样子哦,这个只是简单处理按钮的点击事件

loginBtn.rx.tap
            .subscribe(onNext: {[unowned self]isLogin in
                self.showAlert(message: "开始点击")
            })
            .addDisposableTo(disposeBag)//开始释放

最后是alertView的一个弹出视图

fileprivate func showAlert(message:String) {
        let action = UIAlertAction.init(title: "确定", style: .default, handler: nil)
        let alertView = UIAlertController.init(title: nil, message: message, preferredStyle: .alert)
        alertView.addAction(action)
        present(alertView, animated: true, completion: nil)
    }

以上只是一个简单的值绑定进行的判断,接下来我们要使用Observable和Driver去实现这个登录注册功能,下面实现的比较绕,请坐好车

编辑中…………

posted @ 2017-10-13 16:01  蓝色的风1203  阅读(824)  评论(0编辑  收藏  举报