美文网首页
Rxswift->实现登录界面功能

Rxswift->实现登录界面功能

作者: 骑着雅迪小毛驴上班的老瞿 | 来源:发表于2017-12-12 18:01 被阅读0次

    大概业务逻辑是,用户名必须>=5位才可以输入密码,并且提示语才可以隐藏,密码输入最少需要>=5位提示信息才会隐藏, 账号密码需要最少5位条件同事成立,才可以正常登录.

    import UIKit
    import RxSwift
    import RxCocoa
    class ViewController4: UIViewController {
        @IBOutlet weak var usernameOutlet: UITextField!
        @IBOutlet weak var usernameValidOutlet: UILabel!
        @IBOutlet weak var passwordOutlet: UITextField!
        @IBOutlet weak var passwordValidOutlet: UILabel!
        @IBOutlet weak var doSomethingOutlet: UIButton!
        let disposedBag = DisposeBag()
        let minimalUsernameLength = 5
        override func viewDidLoad() {
            super.viewDidLoad()
            // 定义可观察流
            let usernameValid = usernameOutlet.rx.text.orEmpty
                // 用户名 -> 用户名是否有效
                .map {$0.characters.count >= self.minimalUsernameLength}
                .share(replay: 1)
            // 可观察流和对应的UI进行绑定,如果可观察流等于true 则isEnable ==
            // 当用户修改用户名输入框的内容时就会产生一个新的用户名, 然后通过 map 方法将它转化成用户名是否有效, 最后通过 bind(to: ...) 来决定密码输入框是否可用以及提示语是否隐藏。
            usernameValid
                .bind(to: passwordOutlet.rx.isEnabled)
                .disposed(by: disposedBag)
            usernameValid
                .bind(to: usernameValidOutlet.rx.isHidden)
                .disposed(by: disposedBag)
    
            let passwordValid = passwordOutlet.rx.text.orEmpty
                // 用户密码是否有效
                .map {$0.characters.count >= self.minimalUsernameLength}
                .share(replay: 1)
            passwordValid
                .bind(to: passwordValidOutlet.rx.isHidden)
                .disposed(by: disposedBag)
    
    
            // 接下来就是当用户和密码都有效的时候,按钮就可以点击了
            // 定义按钮的可观察流,用来用于绑定到按钮
            // 通过 Observable.combineLatest(...) { ... } 来将用户名是否有效以及密码是都有效合并出两者是否同时有效,然后用它来控制绿色按钮是否可点击。
            /*
             combineLatest:
             combineLatest就是将多个observable打包转换成我们需要的信号。
             但这样有时候这种信号仍不是我们想要的,这时我们可以用map来转换一下。
             zip和combineLatest有点像。区别在于combineLatest是多个信号中任何一个改变都会打包发送一次,而zip则是所有信号都发生改变之后打包发送。
             举个例子,两个输入框和一个按钮,模拟用户名和密码输入。当两个的长度都大于6的时候才是有效的,并将结果绑定在按扭上。用combineLatest则是两个输入框有任何改变都会发送信号给按扭。而zip则是第一个改变了,第二个也要改变才会发送。
             */
            let everythingValid = Observable.combineLatest(
                usernameValid,
                passwordValid
            ){$0 && $1}// &&取两个同事有效
            .share()
    
            everythingValid
                .bind(to: doSomethingOutlet.rx.isEnabled)
                .disposed(by: disposedBag)
    
            // 接下来点击按钮点击来电反应
            doSomethingOutlet.rx.tap
                .subscribe({_ in showAlert()})
                .disposed(by: disposedBag)
    
            func showAlert(){
                let alertView = UIAlertView(
                    title: "登录成功",
                    message: "恭喜看到了RxSwift的神奇效果!!",
                    delegate: nil,
                    cancelButtonTitle: "OK"
                )
                alertView.show()
            }
        }
    }
    
    

    在开发中如果使用原生的api实现功能的话需要需要的代码量很多,写到你不想写,这里就看到了RxSwift的牛逼之处了吧!

    相关文章

      网友评论

          本文标题:Rxswift->实现登录界面功能

          本文链接:https://www.haomeiwen.com/subject/dlbnixtx.html