在iOS開發(fā)中,經(jīng)常遇到按鈕的響應(yīng)狀態(tài)跟隨輸入框內(nèi)容的變化而變化,以下面兩個場景為例子:
第一個場景:單輸入框場景
獲取驗證碼后,跳轉(zhuǎn)到一個輸入驗證碼的界面,要求輸入框中輸入6位數(shù)字,輸入框下方的提交按鈕才可以被點擊,否則為不可點擊狀態(tài);
第二個場景:多輸入框場景(以兩個輸入框為例子)
用戶必須輸入用戶名和密碼后,才可以點擊下方的登陸按鈕,否則登陸按鈕為不可點擊狀態(tài);
這兩個需求是開發(fā)人員的基操,簡單實現(xiàn)方式我就不再贅述,我們展示一下使用RxSwift來實現(xiàn)這種效果有多easy。
第一個場景,綁定關(guān)系代碼如下:
func setupEvent(){
//使用Rx對輸入框內(nèi)容進行監(jiān)聽,如果監(jiān)聽內(nèi)容發(fā)生改變,按鈕狀態(tài)進行改變
let verifiInput = verifiTextField?.rx.text.orEmpty.asDriver()
.throttle(.milliseconds(300)) //當文本框內(nèi)容改變(0.3秒內(nèi)值若多次改變,取最后一次)
//輸入的內(nèi)容綁定按鈕的響應(yīng)
verifiInput?.map({ $0.count > 5 })
.drive((submitButton?.rx.isEnabled)!)
.disposed(by:disposeBag)
//submit button action
submitButton?.rx.tap.subscribe(onNext: {
print("sumit verification code!!")
}).disposed(by: disposeBag)
}
效果如下
單輸入框.gif
第二個場景,綁定關(guān)系代碼如下:
func setupEvent(){
//listen
Observable.combineLatest((accTextF?.rx.text.orEmpty)!, (pswTextF?.rx.text.orEmpty)!){ textValue1,textValue2 -> Bool in
return textValue1.count > 0 && textValue2.count > 0
}
.map{ $0 }
.bind(to: (loginButton?.rx.isEnabled)!)
.disposed(by: disposeBag)
//login event
loginButton?.rx.tap.subscribe(onNext: {
print("click login!!")
}).disposed(by: disposeBag)
//jump Verification Code page
jumpVerifiButton?.rx.tap.subscribe(onNext: {[weak self] in
self?.navigationController?.pushViewController(VerificationCodeViewController.init(), animated: true)
}).disposed(by: disposeBag)
}
效果如下
多輸入框.gif
響應(yīng)式編程真的很方便,節(jié)省大部分代碼。
完整工程鏈接:
鏈接: https://pan.baidu.com/s/11a_6p7RiaxzHbdRTA5zFJQ 密碼: 5drh

