#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textFieldA;
@property (weak, nonatomic) IBOutlet UITextField *textFieldB;
@property (weak, nonatomic) IBOutlet UIButton *SignButton;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//ReactiveCocoa signal(RACSignal)发送事件流给它的subscriber。目前总共有三种类型的事件:next、error、completed。一个signal在因error终止或者完成前,可以发送任意数量的next事件。在本教程的第一部分,我们将会关注next事件。在第二部分,将会学习error和completed事件。
//打印textFieldA的text;
/*
[self.textFieldA.rac_textSignal subscribeNext:^(id x) {
NSLog(@"输入框的内容%@",x);
}];
//打印超过3个字符长度的text;filter相当于给text加了一个限制(过滤的作用)
[self.textFieldA.rac_textSignal filter:^BOOL(id value) {
NSString *text = value;
return text.length>3;
}];
*/
/*
//RACSignal的每个操作都会返回一个RACsignal,这在术语上叫做连贯接口(fluent interface)。这个功能可以让你直接构建管道,而不用每一步都使用本地变量
RACSignal *textfieldASourceSignal = self.textFieldA.rac_textSignal;
RACSignal *filteredtextFiledAA = [textfieldASourceSignal filter:^BOOL(id value) {
NSString *text = value;
return text.length > 3;
}];
[filteredtextFiledAA subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
*/
/*
//新加的map操作通过block改变了事件的数据。map从上一个next事件接收数据,通过执行block把返回值传给下一个next事件。在上面的代码中,map以NSString为输入,取字符串的长度,返回一个NSNumber。
[[[self.textFieldA.rac_textSignal map:^id(NSString *text) {
return @(text.length);
}]
filter:^BOOL(NSNumber *length) {
return [length integerValue] > 3;
}]
subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
*/
RACSignal *UserNameSignal = [self.textFieldA.rac_textSignal map:^id(NSString *text) {
return @([self isUserName:text]);
}];
RACSignal *PasswordSignal = [self.textFieldB.rac_textSignal map:^id(NSString *text) {
return @([self isPassword:text]);
}];
//RAC宏允许直接把信号的输出应用到对象的属性上。RAC宏有两个参数,第一个是需要设置属性值的对象,第二个是属性名。每次信号产生一个next事件,传递过来的值都会应用到该属性上。
//设置diyigetextFiled的颜色.
RAC(self.textFieldA, backgroundColor) = [UserNameSignal map:^id(NSNumber *usernameValue) {
return [usernameValue boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
}];
//聚合这两个信号来决定登录按钮是否可用。
RACSignal *active1 = [RACSignal combineLatest:@[UserNameSignal,PasswordSignal] reduce:^id(NSNumber *usernameValid,NSNumber *passwordValid){
return @([usernameValid boolValue] && [passwordValid boolValue]);
}];
//将账号和密码和按钮绑定
[active1 subscribeNext:^(NSNumber *signupAction) {
self.SignButton.enabled = [signupAction boolValue];
}];
//Button点击事件
[[self.SignButton rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(id x) {
NSLog(@"按钮被点击了");
}];
}
- (BOOL)isUserName:(NSString *)text
{
return NO;
}
- (BOOL)isPassword:(NSString *)text
{
if (text) {
return YES;
} else {
return NO;
}
}
网友评论