Rxswift->实现登录界面功能

2017-12-12  本文已影响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的牛逼之处了吧!

上一篇下一篇

猜你喜欢

热点阅读