// // RQEditPasswordViewController.m // YueXueChe // // Created by 张嵘 on 2018/12/13. // Copyright © 2018 lee. All rights reserved. // #import "RQVerificationSmsCodeViewController.h" #import "RQPhoneView.h" #import "RQPasswordView.h" #import "RQVerifyView.h" @interface RQVerificationSmsCodeViewController () /// viewModel @property (nonatomic, readwrite, strong) RQVerificationSmsCodeViewModel *viewModel; @property (weak, nonatomic) IBOutlet UIView *containerView; @property (weak, nonatomic) IBOutlet UIButton *sureBtn; @property (strong, readwrite, nonatomic) RQPhoneView *phoneView; @property (strong, readwrite, nonatomic) RQVerifyView *verifyView; @end @implementation RQVerificationSmsCodeViewController @dynamic viewModel; - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.phoneView.loginCodeTextField becomeFirstResponder]; } - (void)viewDidLoad { [super viewDidLoad]; /// 设置 [self rq_setup]; /// 子控件 [self rq_setupSubViews]; /// 初始化部分数据 [self rq_configureData]; } #pragma mark - 初始化 - (void)rq_setup { /// 设置contentSize [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) { make.width.mas_equalTo(RQ_SCREEN_WIDTH); make.height.mas_equalTo(RQ_SCREEN_HEIGHT); }]; UIScrollView *scrollView = (UIScrollView *)self.view; scrollView.alwaysBounceVertical = YES; scrollView.showsHorizontalScrollIndicator = NO; scrollView.showsVerticalScrollIndicator = NO; /// 适配 iOS 11 RQAdjustsScrollViewInsets_Never(scrollView); } #pragma mark - 设置子控件 - (void)rq_setupSubViews { @weakify(self) /// 手机号码 RQPhoneView *phoneView = [RQPhoneView loginCodeView]; self.phoneView = phoneView; [self.containerView addSubview:phoneView]; /// 验证码 RQVerifyView *verifyView = [RQVerifyView verifyView]; self.verifyView = verifyView; [self.containerView addSubview:verifyView]; /// 布局 [phoneView mas_makeConstraints:^(MASConstraintMaker *make) { @strongify(self) make.top.mas_equalTo(self.containerView.mas_top).mas_offset((RQ_APPLICATION_NAV_BAR_HEIGHT + RQ_APPLICATION_STATUS_BAR_HEIGHT)); make.left.mas_equalTo(self.containerView).mas_offset(16.f); make.right.mas_equalTo(self.containerView).mas_offset(-16.f); make.height.mas_offset(64.f); }]; [verifyView mas_makeConstraints:^(MASConstraintMaker *make) { @strongify(self) make.top.mas_equalTo(self.phoneView.mas_bottom).mas_offset(0); make.left.mas_equalTo(self.containerView).mas_offset(16.f); make.right.mas_equalTo(self.containerView).mas_offset(-16.f); make.height.mas_offset(64.f); }]; [self.sureBtn mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(verifyView.mas_bottom).mas_offset(48.f); }]; } #pragma mark - 初始化部分数据 - (void)rq_configureData { /// 拼接数据 self.phoneView.loginCodeTextField.text = [NSString stringWithFormat:@"%@", self.viewModel.phone]; }; #pragma mark - Override - (void)bindViewModel { [super bindViewModel]; @weakify(self); /// 手机号码 RAC(self.viewModel , phone) = [RACSignal merge:@[RACObserve(self.phoneView.loginCodeTextField, text),self.phoneView.loginCodeTextField.rac_textSignal]]; /// 验证码 RAC(self.viewModel , captcha) = [RACSignal merge:@[RACObserve(self.verifyView.verifyTextField, text),self.verifyView.verifyTextField.rac_textSignal]]; /// 注册按钮有效性 RAC(self.sureBtn , enabled) = self.viewModel.validSureSignal; /// 获取验证码 [[self.verifyView.verifyBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UIButton *sender) { @strongify(self); if (![NSString rq_isValidMobile:self.phoneView.loginCodeTextField.text]) { [NSObject rq_showAlertViewWithTitle:@"手机号码错误" message:@"你输入的是一个无效的手机号码" confirmTitle:@"确定"]; return; } /// 需要弹框 @weakify(self); NSString *message = [NSString stringWithFormat:@"我们将发送验证码短信到这个号码:\n %@",self.phoneView.loginCodeTextField.text]; [NSObject rq_showAlertViewWithTitle:@"确认手机号码" message:message confirmTitle:@"好的" cancelTitle:@"取消" confirmAction:^{ @strongify(self); [self.viewModel.captchaCommand execute:nil]; } cancelAction:NULL]; }]; RAC(self.verifyView.verifyBtn , enabled) = self.viewModel.validCaptchaSignal; [[[RACObserve(self.viewModel, captchaTitle) distinctUntilChanged] deliverOnMainThread] subscribeNext:^(NSString * captchaTitle) { @strongify(self); [self.verifyView.verifyBtn setTitle:captchaTitle forState:UIControlStateNormal]; }]; /// 监听获取按钮的enable属性 [[RACObserve(self.verifyView.verifyBtn, enabled) skip:1] subscribeNext:^(NSNumber * enabled) { @strongify(self); self.verifyView.verifyBtn.layer.borderColor = enabled.boolValue? RQColorFromHexString(@"#FA597E").CGColor : RQColorFromHexString(@"#C8C8C8").CGColor; }]; /// show HUD [[[[RACSignal combineLatest:@[self.viewModel.sureCommand.executing , self.viewModel.captchaCommand.executing] reduce:^id(NSNumber *cExecuting , NSNumber * fExecuting){ if (cExecuting.boolValue||fExecuting.boolValue) return @1; return @0; }] deliverOnMainThread] doNext:^(id x) { @strongify(self); [self.view endEditing:YES]; }] subscribeNext:^(NSNumber * showHud) { @strongify(self); if (showHud.boolValue) { [MBProgressHUD rq_showProgressHUD:@"请稍后..."]; }else if(!self.viewModel.error){ [MBProgressHUD rq_hideHUD]; } }]; /// show errors [[self.viewModel.captchaCommand.errors merge:self.viewModel.sureCommand.errors] subscribeNext:^(NSError * error) { [MBProgressHUD rq_showErrorTips:error]; }]; } - (IBAction)sureBtnDidClicked:(id)sender { /// 验证码 六位 且必须是纯数字 if(self.verifyView.verifyTextField.text.length != 6 || ![NSString rq_isPureDigitCharacters:self.verifyView.verifyTextField.text]){ [NSObject rq_showAlertViewWithTitle:@"验证码超时,请重新获取验证码。" message:nil confirmTitle:@"确定"]; return ; } [self.viewModel.sureCommand execute:@{RQCaptchaKey : self.verifyView.verifyTextField.text}]; } @end