在viewmodel中
- (instancetype)init{
self = [super init];
if (!self) {
return nil; }
@weakify(self)
self.loginCommand = [[RACCommand alloc]initWithEnabled:[self validateLoginInputs] signalBlock:^RACSignal *(id input) {
@strongify(self)
return [self signInWithUsername:self.userName password:self.passWord];
}];
return self; }
/* ** * 校驗(yàn)btn可點(diǎn)的方法 */
- (RACSignal *)validateLoginInputs{
RACSignal *sig = [RACSignal combineLatest:@[RACObserve(self, userName),RACObserve(self, passWord)] reduce:^id{ return @([self checkUserName:_userName] && _passWord.length >=6);
}];
return sig;}
- (BOOL )checkUserName:(NSString *)userName{ US2Condition *condition = [[US2Condition alloc] initWithRegexString:@"1[0-9]{10}"];
if ([condition check:userName]) {
return YES;
}
return NO;
}
/* ** * 點(diǎn)擊按鈕時(shí)會(huì)觸發(fā)的方法 */
- (RACSignal *)signInWithUsername:(NSString *)username password:(NSString *)password{
return [[[RACSignal createSignal:^RACDisposable *(idsubscriber) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
[manager setTaskDidReceiveAuthenticationChallengeBlock:^NSURLSessionAuthChallengeDisposition(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task, NSURLAuthenticationChallenge * _Nonnull challenge, NSURLCredential *__autoreleasing _Nullable * _Nullable credential) {
if (challenge.previousFailureCount == 0) {NSURLCredential *mycredential = [[NSURLCredential alloc]initWithUser:username password:password persistence:NSURLCredentialPersistenceForSession];
*credential = mycredential;
return NSURLSessionAuthChallengeUseCredential;}else{return NSURLSessionAuthChallengeCancelAuthenticationChallenge;}}];
NSDictionary *parameters = @{};[manager POST:@"xxxx" parameters:parameterssuccess:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:self.userName forKey:@"userName"];[defaults setObject:self.passWord forKey:@"passWord"];[defaults synchronize];
[subscriber sendNext:responseObject];
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
[subscriber sendError:error];
}];
});
return nil;
}]publish]autoconnect];}
在controller中使用先綁定信號(hào)----
- (void)viewDidLoad {
[super viewDidLoad];
[self setBackGroundColorForTextfield];
}
// 處理text的背景顏色
- (void)setBackGroundColorForTextfield{
self.loginbtn = [[DeformationButton alloc]initWithFrame:CGRectMake(130, 350, 100, 50) withColor:[UIColor redColor]] ;
[self.loginbtn.forDisplayButton setTitle:@"登陸" forState:UIControlStateNormal];[self.loginbtn.forDisplayButton.titleLabel setFont:[UIFont systemFontOfSize:15]];
[self.loginbtn.forDisplayButton setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];[self.loginbtn.forDisplayButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 6, 0, 0)];
[self.view addSubview:self.loginbtn];
/**
*與modelview進(jìn)行綁定
*/
[self.userName.rac_textSignal subscribeNext:^(NSString *text) {self.loginmodel.userName = text;}];
[self.passWord.rac_textSignal subscribeNext:^(NSString *x) {self.loginmodel.passWord = x;}];self.loginbtn.rac_command = self.loginmodel.loginCommand;
/**
*rac 使用代理協(xié)議修改placeholder
*/
self.userName.delegate = self;
RACSignal *sigBegin = [self rac_signalForSelector:@selector(textFieldDidBeginEditing:) fromProtocol:@protocol(UITextFieldDelegate)];
RACSignal *sigEnd = [self rac_signalForSelector:@selector(textFieldDidEndEditing:) fromProtocol:@protocol(UITextFieldDelegate)];
RAC(self.userName, placeholder) = [[RACSignal merge:@[sigBegin, sigEnd]]map:^id(UITextField *value) {return self.userName.editing?@"手機(jī)號(hào)":@"請(qǐng)輸入手機(jī)號(hào)";}];
self.passWord.delegate = self;
RACSignal *sig_Begin = [self rac_signalForSelector:@selector(textFieldDidBeginEditing:) fromProtocol:@protocol(UITextFieldDelegate)];
RACSignal *sig_End = [self rac_signalForSelector:@selector(textFieldDidEndEditing:) fromProtocol:@protocol(UITextFieldDelegate)];
RAC(self.passWord, placeholder) = [[RACSignal merge:@[sig_Begin, sig_End]]map:^id(UITextField *value) {
return self.passWord.editing?@"密碼":@"請(qǐng)輸入密碼";
}];
/**
*監(jiān)聽并修改textfield的背景色
*/
RAC(self.userName,backgroundColor) = [self.userName.rac_textSignal map:^(NSString *text) {
return text.length == 11? [UIColor whiteColor]:[UIColor lightGrayColor];
}];
RAC(self.passWord,backgroundColor) = [self.passWord.rac_textSignal map:^(NSString *text) {
return text.length >= 6? [UIColor whiteColor]:[UIColor lightGrayColor];
}];
/**
*當(dāng)點(diǎn)擊按鈕的時(shí)候textfiled 不能編輯
*/
[self.loginbtn.rac_command.executing subscribeNext:^(NSNumber *x) {
NSLog(@"%@-",x);
if ([x boolValue]) {
self.userName.userInteractionEnabled = NO;
self.passWord.userInteractionEnabled = NO;
}else{
self.userName.userInteractionEnabled = YES;
self.passWord.userInteractionEnabled = YES;
}
}];
[self.loginbtn.rac_command.executionSignals.flatten subscribeNext:^(id isOk) {
NSLog(@"%@-----",isOk);
UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
Ex_ViewController *ex = [story instantiateViewControllerWithIdentifier:@"ex_viewController"];
[self presentViewController:ex animated:YES completion:nil];
}];
[self.loginbtn.rac_command.errors subscribeNext:^(id isOk) {
NSLog(@"%@,",isOk);
[self setAlertView];
}];
}
- (void)setAlertView{
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"提示" message:@"輸入的手機(jī)號(hào)或密碼有誤" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
self.loginbtn.isLoading = NO;
}];
[alertVC addAction:action];
[self presentViewController:alertVC animated:YES completion:nil];
}
對(duì)于這種編程還在學(xué)習(xí)中,會(huì)不斷更新----