ReactiveCocoa学习(二)
来源:互联网 发布:软件开发助理发展前景 编辑:程序博客网 时间:2024/05/23 02:06
以登录为例
一般登录界面都会有一用户名和密码输入框,还有一个登录按钮,这次仅仅为了展现一个登录的,不涉及注册和忘记密码,记住密码此类功能。
RAC里面很多都是以block的形式出现的,这样会造成内存警告,所以务必要写上typeof(self)weakSelf = self;之后调用方法或者属性用weakSelf代替
考虑UE
1:假设现在要求 用户名长度 >=2且密码长度>=3,登录按钮可用。由于现在RAC是以Signal为机制的,那么用户名长度变化为一个Signal命名为validUsernameSignal密码长度变化为一个Signal 命名为validPasswordSignal,且在两者输入无效的情况下,输入框为黄色,反之白色 。即
//为了简单的监测用户输入的有效-(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]; }];
0 0
- ReactiveCocoa学习(二)
- ReactiveCocoa学习(二)
- ReactiveCocoa框架学习(二)
- ReactiveCocoa & MVVM 学习总结二
- ReactiveCocoa<二>
- reactiveCocoa学习
- ReactiveCocoa学习
- ReactiveCocoa学习
- ReactiveCocoa学习
- ReactiveCocoa学习
- reactiveCocoa实践二
- ReactiveCocoa入门教程二
- ReactiveCocoa入门教程二
- ReactiveCocoa讲解之---二
- ReactiveCocoa用法示例(二)
- ReactiveCocoa学习笔记(一)
- ReactiveCocoa 学习笔记(一)
- ReactiveCocoa学习(一)
- 三种常用链接池c3p0,dbcp,proxool
- HDU 1258 Sum It Up (DFS)
- BestCoder Round #50 (div.2)-----C The mook jong
- HDU 1260 Tickets
- iOS内存管理策略和实践
- ReactiveCocoa学习(二)
- selenium grid2 - node说明
- js_事件流
- 面向对象(构造函数+构造代码块)-第10天
- 配置struts出现404错误
- Android开发工具汇总
- 算法进军大道(二)
- Poj 3461 Oulipo
- BeagleBone Black使用无线网卡通过WIFI联网