通過RxSwift實現(xiàn)一個簡單的功能---用戶登錄界面邏輯
實現(xiàn)的邏輯為:用戶名和密碼分別長度大于6位時登錄按鈕可以點擊,否則不可以點擊, 用戶名和密碼為123456的時候登錄成功,否則不予登錄
似不似很簡單!
效果圖:

-
StoryBoard中拖入控件@IBOutlet weak var userNameField: UITextField! @IBOutlet weak var passwordField: UITextField! @IBOutlet weak var loginButton: UIButton!
let disposeBag = DisposeBag() //用于管理Observable
- 創(chuàng)建一個結(jié)構(gòu)體,用戶保存登錄返回信息
struct LoginResult {
var isLogin: Bool? //是否登錄成功
var info: String? //信息
}
- 分別創(chuàng)建用于檢測用戶名和密碼是否可用的信號源
//用戶名是否可用
let userNameIsAvalid = self.userNameField.rx.text.orEmpty.map({ $0.characters.count >= 6 })
//密碼是否可用
let passwordIsAvalid = self.passwordField.rx.text.orEmpty.map({ $0.characters.count >= 6 })
- 根據(jù)用戶名和密碼是否可用,控制登錄按鈕的激活狀態(tài)開關(guān)
//通過用戶名和密碼是否可用 共同作用于登錄按鈕的可用性
Observable.combineLatest(userNameIsAvalid, passwordIsAvalid)
.map({ $0 && $1 }) //當兩者都處于可用狀態(tài)時登錄按鈕方為可用
.subscribe(onNext:{
self.loginButton.isEnabled = $0
self.loginButton.backgroundColor = $0 ? UIColor.red : UIColor.gray
self.loginButton.setTitleColor(($0 ? UIColor.white : UIColor.groupTableViewBackground), for: .normal)
})
.addDisposableTo(disposeBag)
- 為登錄按鈕綁定事件
//綁定登錄按鈕事件
self.loginButton.rx.controlEvent(UIControlEvents.touchUpInside).flatMap({_ in
self.isAvalidLoginRequest() //在這里處理登錄請求
}).subscribe(onNext: { [weak self] loginResule in
self?.showAlert(withMessage: loginResule.info!)
})
.addDisposableTo(disposeBag)
- 登錄請求處理
func isAvalidLoginRequest() -> Observable<LoginResult> {
return Observable<LoginResult>.create({observer in
if self.userNameField.text == "123456" && self.passwordField.text == "123456" {
observer.onNext(LoginResult(isLogin: true, info: "登陸成功!"))
}else {
observer.onNext(LoginResult(isLogin: false, info: "用戶名或密碼錯誤,請重試!"))
}
return Disposables.create()
})
}