I am following this tutorial: http://www.raywenderlich.com/62699/reactivecocoa-tutorial-pt1. It is working for username and password field.
I am trying to create sign up form which contains three fields: email, password, confirmPassword.
I have validated email address (working perfectly) I have validated password like this:
password should be at least 6 characters and both password and confirmPassword must be same.
Here is my code:
RACSignal *validEmailSignal =
[emailTextField.rac_textSignal
map:^id(NSString *text) {
return @([text isValidEmailAddress]);
}];
RACSignal *validPasswordSignal =
[passwordTextField.rac_textSignal
map:^id(NSString *text) {
return @([text isEqualToString:self.confirmPasswordTextField.text] && text.length >5);
}];
RACSignal *validConfirmPasswordSignal =
[confirmPasswordTextField.rac_textSignal
map:^id(NSString *text) {
return @([text isEqualToString:self.passwordTextField.text] && text.length >5 );
}];
[[validEmailSignal
map:^id(NSNumber *emailValid) {
return [emailValid boolValue] ? [UIColor greenColor] : [UIColor redColor];
}]
subscribeNext:^(UIColor *color) {
emailTextField.layer.borderColor=[color CGColor];
emailTextField.layer.borderWidth= 1.0f;
}];
[[validPasswordSignal
map:^id(NSNumber *passwordValid) {
return [passwordValid boolValue] ? [UIColor greenColor] : [UIColor redColor];
}]
subscribeNext:^(UIColor *color) {
passwordTextField.layer.borderColor=[color CGColor];
passwordTextField.layer.borderWidth= 1.0f;
confirmPasswordTextField.layer.borderColor=[color CGColor];
confirmPasswordTextField.layer.borderWidth= 1.0f;
}];
[[validConfirmPasswordSignal
map:^id(NSNumber *passwordValid) {
return [passwordValid boolValue] ? [UIColor greenColor] : [UIColor redColor];
}]
subscribeNext:^(UIColor *color) {
passwordTextField.layer.borderColor=[color CGColor];
passwordTextField.layer.borderWidth= 1.0f;
confirmPasswordTextField.layer.borderColor=[color CGColor];
confirmPasswordTextField.layer.borderWidth= 1.0f;
}];
RACSignal *signUpActiveSignal =
[RACSignal combineLatest:@[validEmailSignal, validPasswordSignal, validConfirmPasswordSignal]
reduce:^id(NSNumber *emailValid, NSNumber *passwordValid, NSNumber *confirmPasswordValid) {
return @([emailValid boolValue] && [passwordValid boolValue] && [confirmPasswordValid boolValue]);
}];
[signUpActiveSignal subscribeNext:^(NSNumber *signupActive) {
NSLog(@"sign up button enabled : %hhd", [signupActive boolValue]);
_signUpButton.enabled = [signupActive boolValue];
}];
Here, if I take only emailValid's value, it is sending 1 when valid. But if I include all three values, it always returns 0 even if all are valid.
Here are snap shots of the simulator:
I just wanted to enable "Sign up" button when all three fields are valid. I also want disable "Go" button on the keyboard till validation success.