ReactiveCocoa学习(二)
以登录为例一般登录界面都会有一用户名和密码输入框,还有一个登录按钮,这次仅仅为了展现一个登录的,不涉及注册和忘记密码,记住密码此类功能。 //为了简单的监测用户输入的有效
-(BOOL) isValidInput:(NSString *)text tag:(NSInteger)tag{
BOOL flag = NO;
if (tag == 0) {
//用户名
flag = text.length >= 2;
}else{
//密码
flag = text.length >= 3;
}
return flag;
}
typeof(self)weakSelf = self;
RACSignal *validUsernameSignal = [_nameTextField.rac_textSignal map:^id(id value) {
return @([weakSelf isValidInput:value tag:0]);
}];
RACSignal *validPasswordSignal = [_pwdTextField.rac_textSignal map:^id(NSString *text) {
return @([weakSelf isValidInput:text tag:1]);
}];
//转换这些信号,从而能为输入框设置不同的背景颜色。
RAC(_nameTextField,backgroundColor) =
[validUsernameSignal
map:^id(NSNumber *nameValid){
return[nameValid boolValue] ? [UIColor clearColor]:[UIColor yellowColor];
}];
RAC(_pwdTextField,backgroundColor) = [validPasswordSignal
map:^id(NSNumber *passwordValid){
return[passwordValid boolValue] ? [UIColor clearColor]:[UIColor yellowColor];
}];
2: 把以上两个信号组合一起,才能真正的表示登录按钮的可用性(enabled) //信号聚合 使用combineLatest:reduce:方法把validUsernameSignal和validPasswordSignal产生的最新的值聚合在一起,并生成一个新的信号。每次这两个源信号的任何一个产生新值时,reduce block都会执行,block的返回值会发给下一个信号。
RACSignal *signUpActiveSignal = [RACSignal combineLatest:@[validUsernameSignal,validPasswordSignal] reduce:^id(NSNumber*usernameValid,NSNumber *passwordValid){
return @([usernameValid boolValue]&&[passwordValid boolValue]);
}];
[signUpActiveSignal subscribeNext:^(NSNumber*signupActive){
_loginBtn.enabled = [signupActive boolValue];
_loginBtn.alpha = [signupActive boolValue] ? 1:0.4;
}];
3: 当登录按钮可用,点击登录按钮,如果登录成功,则进入登录成功界面反之失败界面。这里假设用户名输入的为“123”则登录成功。 [[[_loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside]flattenMap:^RACStream *(id value) {
return [weakSelf signInSignal];
}]subscribeNext:^(id x) {
[weakSelf IsloginSuccess:[x boolValue]];
}];
- (RACSignal *)signInSignal{
[self resignResponder];
typeof(self)weakSelf = self;
return [RACSignal createSignal:^RACDisposable *(id subscriber){
[weakSelf login:_nameTextField.text password:_pwdTextField.text block:^(BOOL obj) {
[subscriber sendNext:@(obj)];
[subscriber sendCompleted];
}];
return nil;
}];
}
-(void)IsloginSuccess:(BOOL)flag{
SuccessViewController *uisvc = [[ SuccessViewController alloc]init];
[self.navigationController pushViewController:uisvc animated:true];
uisvc.title = flag ?@"登录成功": @"登录失败";
}
- (void) login:(NSString * )carNumber password:(NSString *)pwd block:(Block_Bool)result{
//Block_Bool的define定义 :typedef void (^Block_Bool) (BOOL b);
if ([_nameTextField.text isEqualToString:@"123"]) {
result(YES);
return;
}
result(NO);
}
4:为了更好的展示UE当点击self.view时,让键盘隐藏,这时加个手势: UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]init];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:tap];
// 这是给self.view加上一个事件,点击的时候让键盘隐藏。
[tap rac_signalForSelector:@selector(resignResponder)];
RACSignal *tapSignal = [tap rac_gestureSignal];
[[tapSignal map:^id(id value) {
return value;
}] subscribeNext:^(id x) {
[weakSelf.view endEditing:YES];
}];
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |