123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- //
- // 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
|