##使用RxSwift可以很好的处理登录的一些逻辑处理,下面的代码不仅是自己以后可能会复用的也是加深记忆的过程。
登录模块的一些Service
import Foundation
class InputValidator {
//验证是否是合法邮箱地址
class func isValidEmail(email:String) -> Bool {
let regex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
let isValid = predicate.evaluate(with: email)
return isValid
}
//验证密码长度
class func isValidPassword(password:String) -> Bool {
return password.count >= 8
}
//验证UIDatePicker输入的日期是否小于当天
class func isValidDate(date:Date) -> Bool {
let calender = NSCalendar.current
let compare = calender.compare(date,
to: Date(),
toGranularity: .day)
return compare == .orderedAscending
}
}
##在ViewController中的处理。直接上代码
class SignUpViewController: UIViewController {
@IBOutlet weak var userNameInput: UITextField!
@IBOutlet weak var passwordInput: UITextField!
@IBOutlet weak var signBtn: UIButton!
var bag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
self.userNameInput.layer.borderWidth = 1
self.passwordInput.layer.borderWidth = 1
let emailObservable = self.userNameInput.rx.text.orEmpty
.map{ (input:String) -> Bool in
return InputValidator.isValidEmail(email: input)
}
_ = emailObservable.map{ (isValid:Bool) -> CGColor in
return isValid ? UIColor.green.cgColor : UIColor.clear.cgColor
}.subscribe(onNext: { (color) in
self.userNameInput.layer.borderColor = color
})
let passwordObservable = self.passwordInput.rx.text.orEmpty
.map{ (password:String) -> Bool in
return InputValidator.isValidPassword(password: password)
}
_ = passwordObservable.map{ (isValid:Bool) -> CGColor in
return isValid ? UIColor.green.cgColor : UIColor.clear.cgColor
}.subscribe(onNext: { (color) in
self.passwordInput.layer.borderColor = color
})
Observable.combineLatest(emailObservable,passwordObservable) {
(validEmail:Bool,validPassword:Bool) -> [Bool] in
return [validEmail,validPassword]
}.map{ (input:[Bool]) -> Bool in
return input.reduce(true,{ (x,y) -> Bool in
x && y
})
}.subscribe(onNext:{(isValid) in
self.signBtn.isEnabled = isValid ? true : false
})
}
}