使用 RxSwift 和 RXCocoa 在按钮单击时验证所有文本字段
Validate all textfield on button click using RxSwift and RXCocoa
我是 RxSwift 和 RxCocoa 的新手,正在学习。
我想在单击按钮时验证所有文本字段,并且根据验证我需要向用户显示警告消息。
验证成功后我需要在table中插入记录。
参考以下代码...
var result = txtFname.rx.text
result.asObservable().subscribe(onNext: { text in
if text!.isEmpty {
self.showAlert(msg: "Plese enter first name.")
self.txtFname.becomeFirstResponder()
}
}).disposed(by: disposeBag)
result = txtLname.rx.text
result.asObservable().subscribe(onNext: { text in
if text!.isEmpty {
self.showAlert(msg: "Please enter last name.")
self.txtLname.becomeFirstResponder()
}
}).disposed(by: disposeBag)
result = txtEmail.rx.text
result.asObservable().subscribe(onNext: { text in
if text!.isEmpty {
self.showAlert(msg: "Please enter email id.")
self.txtLname.becomeFirstResponder()
}
}).disposed(by: disposeBag)
//need to check here if all fields are valid or not
//if all fields are valid then insert record....
当我按下一个按钮时,它一次检查所有验证并显示警报...
但我想做的是,如果一次验证失败,那么在上一次验证成功之前,它不应该再进一步...
我不知道如何实现。任何帮助将不胜感激。
你可以这样做。
self.button.rx.tap.asObservable()
.filter({ (_) -> Bool in
guard !(self.txtFname.text ?? "").isEmpty else {
self.showAlert(msg: "Please enter first name.")
self.txtFname.becomeFirstResponder()
return false
}
guard !(self.txtLname.text ?? "").isEmpty else {
self.showAlert(msg: "Please enter last name.")
self.txtLname.becomeFirstResponder()
return false
}
guard !(self.txtEmail.text ?? "").isEmpty else {
self.showAlert(msg: "Please enter email id.")
self.txtEmail.becomeFirstResponder()
return false
}
return true
})
.subscribe { _ in
// do something when all the fields are valid
self.showAlert(msg: "All fields are valid")
}
.disposed(by: disposeBag)
这不是完全相同的答案,但您可以实现类似的结果。
class DataValidator {
class func validName(name:String) -> Bool {
if let regex =
try? NSRegularExpression(pattern: "^\w+( \w+\.?)*$", options:
.CaseInsensitive) {
return name.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) > 2 &&
regex!.matchesInString(name, options: NSMatchingOptions.ReportProgress, range: NSMakeRange(0,
name.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))).count > 0 }
return false }
class func validEmail(email:String) -> Bool{ if let regex =
try? NSRegularExpression(pattern: "^\S+@\S+\.\S+$", options: .CaseInsensitive){
return regex!.matchesInString(email, options: NSMatchingOptions.ReportProgress, range: NSMakeRange(0,
email.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))).count > 0 }
return false }
}
}// end of validator class
您可以使用如下内容:
let nameSignal:RACSignal = nameTextField.rac_textSignal().map { (text) -> AnyObject! in
return DataValidator.validName(text as! String) }
let emailSignal = emailTextField.rac_textSignal().map { (text) -> AnyObject! in
return DataValidator.validEmail(text as! String) }
RACSignal.combineLatest([nameSignal, emailSignal]).subscribeNext { (valid) -> Void in
self.button.enabled = valid as! Bool
}
class Validator {
class func validEmail(email:String) -> Bool {
if let regex = try? NSRegularExpression(pattern: "^\S+@\S+\.\S+$", options: .caseInsensitive){
return regex.matches(in: email, options: NSRegularExpression.MatchingOptions.reportProgress, range: NSMakeRange(0, email.lengthOfBytes(using: String.Encoding.utf8))).count > 0 }
return false
}
}
那么就可以这样使用了:
var isValid : Observable<Bool>{
return Observable.combineLatest(username.asObservable())
{ (username) in
return Validator.validEmail(email: username)
}
}
我是 RxSwift 和 RxCocoa 的新手,正在学习。
我想在单击按钮时验证所有文本字段,并且根据验证我需要向用户显示警告消息。
验证成功后我需要在table中插入记录。
参考以下代码...
var result = txtFname.rx.text
result.asObservable().subscribe(onNext: { text in
if text!.isEmpty {
self.showAlert(msg: "Plese enter first name.")
self.txtFname.becomeFirstResponder()
}
}).disposed(by: disposeBag)
result = txtLname.rx.text
result.asObservable().subscribe(onNext: { text in
if text!.isEmpty {
self.showAlert(msg: "Please enter last name.")
self.txtLname.becomeFirstResponder()
}
}).disposed(by: disposeBag)
result = txtEmail.rx.text
result.asObservable().subscribe(onNext: { text in
if text!.isEmpty {
self.showAlert(msg: "Please enter email id.")
self.txtLname.becomeFirstResponder()
}
}).disposed(by: disposeBag)
//need to check here if all fields are valid or not
//if all fields are valid then insert record....
当我按下一个按钮时,它一次检查所有验证并显示警报...
但我想做的是,如果一次验证失败,那么在上一次验证成功之前,它不应该再进一步...
我不知道如何实现。任何帮助将不胜感激。
你可以这样做。
self.button.rx.tap.asObservable()
.filter({ (_) -> Bool in
guard !(self.txtFname.text ?? "").isEmpty else {
self.showAlert(msg: "Please enter first name.")
self.txtFname.becomeFirstResponder()
return false
}
guard !(self.txtLname.text ?? "").isEmpty else {
self.showAlert(msg: "Please enter last name.")
self.txtLname.becomeFirstResponder()
return false
}
guard !(self.txtEmail.text ?? "").isEmpty else {
self.showAlert(msg: "Please enter email id.")
self.txtEmail.becomeFirstResponder()
return false
}
return true
})
.subscribe { _ in
// do something when all the fields are valid
self.showAlert(msg: "All fields are valid")
}
.disposed(by: disposeBag)
这不是完全相同的答案,但您可以实现类似的结果。
class DataValidator {
class func validName(name:String) -> Bool {
if let regex =
try? NSRegularExpression(pattern: "^\w+( \w+\.?)*$", options:
.CaseInsensitive) {
return name.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) > 2 &&
regex!.matchesInString(name, options: NSMatchingOptions.ReportProgress, range: NSMakeRange(0,
name.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))).count > 0 }
return false }
class func validEmail(email:String) -> Bool{ if let regex =
try? NSRegularExpression(pattern: "^\S+@\S+\.\S+$", options: .CaseInsensitive){
return regex!.matchesInString(email, options: NSMatchingOptions.ReportProgress, range: NSMakeRange(0,
email.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))).count > 0 }
return false }
}
}// end of validator class
您可以使用如下内容:
let nameSignal:RACSignal = nameTextField.rac_textSignal().map { (text) -> AnyObject! in
return DataValidator.validName(text as! String) }
let emailSignal = emailTextField.rac_textSignal().map { (text) -> AnyObject! in
return DataValidator.validEmail(text as! String) }
RACSignal.combineLatest([nameSignal, emailSignal]).subscribeNext { (valid) -> Void in
self.button.enabled = valid as! Bool
}
class Validator {
class func validEmail(email:String) -> Bool {
if let regex = try? NSRegularExpression(pattern: "^\S+@\S+\.\S+$", options: .caseInsensitive){
return regex.matches(in: email, options: NSRegularExpression.MatchingOptions.reportProgress, range: NSMakeRange(0, email.lengthOfBytes(using: String.Encoding.utf8))).count > 0 }
return false
}
}
那么就可以这样使用了:
var isValid : Observable<Bool>{
return Observable.combineLatest(username.asObservable())
{ (username) in
return Validator.validEmail(email: username)
}
}