大概業(yè)務(wù)邏輯是,用戶名必須>=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)
// 可觀察流和對應(yīng)的UI進(jìn)行綁定,如果可觀察流等于true 則isEnable ==
// 當(dāng)用戶修改用戶名輸入框的內(nèi)容時就會產(chǎn)生一個新的用戶名, 然后通過 map 方法將它轉(zhuǎn)化成用戶名是否有效, 最后通過 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)
// 接下來就是當(dāng)用戶和密碼都有效的時候,按鈕就可以點擊了
// 定義按鈕的可觀察流,用來用于綁定到按鈕
// 通過 Observable.combineLatest(...) { ... } 來將用戶名是否有效以及密碼是都有效合并出兩者是否同時有效,然后用它來控制綠色按鈕是否可點擊。
/*
combineLatest:
combineLatest就是將多個observable打包轉(zhuǎn)換成我們需要的信號瓦胎。
但這樣有時候這種信號仍不是我們想要的,這時我們可以用map來轉(zhuǎn)換一下衬鱼。
zip和combineLatest有點像。區(qū)別在于combineLatest是多個信號中任何一個改變都會打包發(fā)送一次憔杨,而zip則是所有信號都發(fā)生改變之后打包發(fā)送鸟赫。
舉個例子,兩個輸入框和一個按鈕消别,模擬用戶名和密碼輸入抛蚤。當(dāng)兩個的長度都大于6的時候才是有效的,并將結(jié)果綁定在按扭上寻狂。用combineLatest則是兩個輸入框有任何改變都會發(fā)送信號給按扭岁经。而zip則是第一個改變了,第二個也要改變才會發(fā)送蛇券。
*/
let everythingValid = Observable.combineLatest(
usernameValid,
passwordValid
){$0 && $1}// &&取兩個同事有效
.share()
everythingValid
.bind(to: doSomethingOutlet.rx.isEnabled)
.disposed(by: disposedBag)
// 接下來點擊按鈕點擊來電反應(yīng)
doSomethingOutlet.rx.tap
.subscribe({_ in showAlert()})
.disposed(by: disposedBag)
func showAlert(){
let alertView = UIAlertView(
title: "登錄成功",
message: "恭喜看到了RxSwift的神奇效果!!",
delegate: nil,
cancelButtonTitle: "OK"
)
alertView.show()
}
}
}
在開發(fā)中如果使用原生的api實現(xiàn)功能的話需要需要的代碼量很多,寫到你不想寫,這里就看到了RxSwift的牛逼之處了吧!