Search code examples
iosswiftuibuttonrx-swiftrx-cocoa

Validate all textfield on button click using RxSwift and RXCocoa


I am new to RxSwift and RxCocoa and I'm learning it.

I want to validate all textfield on button click and based on the validation I need to show alert message to user.

After validation is successful I need to insert record in table.

Refer the following code...

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....

When I press a button and it check all the validation at one and show alert...

But I want to do like if one validation is fail then it should not go further until previous validation is successful...

I don't know how to achieve this. Any help will be appreciated.


Solution

  • You could do something like this.

      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)