RQVerificationSmsCodeViewController.m 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. //
  2. // RQEditPasswordViewController.m
  3. // YueXueChe
  4. //
  5. // Created by 张嵘 on 2018/12/13.
  6. // Copyright © 2018 lee. All rights reserved.
  7. //
  8. #import "RQVerificationSmsCodeViewController.h"
  9. #import "RQPhoneView.h"
  10. #import "RQPasswordView.h"
  11. #import "RQVerifyView.h"
  12. @interface RQVerificationSmsCodeViewController ()
  13. /// viewModel
  14. @property (nonatomic, readwrite, strong) RQVerificationSmsCodeViewModel *viewModel;
  15. @property (weak, nonatomic) IBOutlet UIView *containerView;
  16. @property (weak, nonatomic) IBOutlet UIButton *sureBtn;
  17. @property (strong, readwrite, nonatomic) RQPhoneView *phoneView;
  18. @property (strong, readwrite, nonatomic) RQVerifyView *verifyView;
  19. @end
  20. @implementation RQVerificationSmsCodeViewController
  21. @dynamic viewModel;
  22. - (void)viewWillAppear:(BOOL)animated{
  23. [super viewWillAppear:animated];
  24. [self.phoneView.loginCodeTextField becomeFirstResponder];
  25. }
  26. - (void)viewDidLoad {
  27. [super viewDidLoad];
  28. /// 设置
  29. [self rq_setup];
  30. /// 子控件
  31. [self rq_setupSubViews];
  32. /// 初始化部分数据
  33. [self rq_configureData];
  34. }
  35. #pragma mark - 初始化
  36. - (void)rq_setup {
  37. /// 设置contentSize
  38. [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
  39. make.width.mas_equalTo(RQ_SCREEN_WIDTH);
  40. make.height.mas_equalTo(RQ_SCREEN_HEIGHT);
  41. }];
  42. UIScrollView *scrollView = (UIScrollView *)self.view;
  43. scrollView.alwaysBounceVertical = YES;
  44. scrollView.showsHorizontalScrollIndicator = NO;
  45. scrollView.showsVerticalScrollIndicator = NO;
  46. /// 适配 iOS 11
  47. RQAdjustsScrollViewInsets_Never(scrollView);
  48. }
  49. #pragma mark - 设置子控件
  50. - (void)rq_setupSubViews {
  51. @weakify(self)
  52. /// 手机号码
  53. RQPhoneView *phoneView = [RQPhoneView loginCodeView];
  54. self.phoneView = phoneView;
  55. [self.containerView addSubview:phoneView];
  56. /// 验证码
  57. RQVerifyView *verifyView = [RQVerifyView verifyView];
  58. self.verifyView = verifyView;
  59. [self.containerView addSubview:verifyView];
  60. /// 布局
  61. [phoneView mas_makeConstraints:^(MASConstraintMaker *make) {
  62. @strongify(self)
  63. make.top.mas_equalTo(self.containerView.mas_top).mas_offset((RQ_APPLICATION_NAV_BAR_HEIGHT + RQ_APPLICATION_STATUS_BAR_HEIGHT));
  64. make.left.mas_equalTo(self.containerView).mas_offset(16.f);
  65. make.right.mas_equalTo(self.containerView).mas_offset(-16.f);
  66. make.height.mas_offset(64.f);
  67. }];
  68. [verifyView mas_makeConstraints:^(MASConstraintMaker *make) {
  69. @strongify(self)
  70. make.top.mas_equalTo(self.phoneView.mas_bottom).mas_offset(0);
  71. make.left.mas_equalTo(self.containerView).mas_offset(16.f);
  72. make.right.mas_equalTo(self.containerView).mas_offset(-16.f);
  73. make.height.mas_offset(64.f);
  74. }];
  75. [self.sureBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
  76. make.top.mas_equalTo(verifyView.mas_bottom).mas_offset(48.f);
  77. }];
  78. }
  79. #pragma mark - 初始化部分数据
  80. - (void)rq_configureData {
  81. /// 拼接数据
  82. self.phoneView.loginCodeTextField.text = [NSString stringWithFormat:@"%@", self.viewModel.phone];
  83. };
  84. #pragma mark - Override
  85. - (void)bindViewModel {
  86. [super bindViewModel];
  87. @weakify(self);
  88. /// 手机号码
  89. RAC(self.viewModel , phone) = [RACSignal merge:@[RACObserve(self.phoneView.loginCodeTextField, text),self.phoneView.loginCodeTextField.rac_textSignal]];
  90. /// 验证码
  91. RAC(self.viewModel , captcha) = [RACSignal merge:@[RACObserve(self.verifyView.verifyTextField, text),self.verifyView.verifyTextField.rac_textSignal]];
  92. /// 注册按钮有效性
  93. RAC(self.sureBtn , enabled) = self.viewModel.validSureSignal;
  94. /// 获取验证码
  95. [[self.verifyView.verifyBtn rac_signalForControlEvents:UIControlEventTouchUpInside]
  96. subscribeNext:^(UIButton *sender) {
  97. @strongify(self);
  98. if (![NSString rq_isValidMobile:self.phoneView.loginCodeTextField.text]) {
  99. [NSObject rq_showAlertViewWithTitle:@"手机号码错误" message:@"你输入的是一个无效的手机号码" confirmTitle:@"确定"];
  100. return;
  101. }
  102. /// 需要弹框
  103. @weakify(self);
  104. NSString *message = [NSString stringWithFormat:@"我们将发送验证码短信到这个号码:\n %@",self.phoneView.loginCodeTextField.text];
  105. [NSObject rq_showAlertViewWithTitle:@"确认手机号码" message:message confirmTitle:@"好的" cancelTitle:@"取消" confirmAction:^{
  106. @strongify(self);
  107. [self.viewModel.captchaCommand execute:nil];
  108. } cancelAction:NULL];
  109. }];
  110. RAC(self.verifyView.verifyBtn , enabled) = self.viewModel.validCaptchaSignal;
  111. [[[RACObserve(self.viewModel, captchaTitle)
  112. distinctUntilChanged]
  113. deliverOnMainThread]
  114. subscribeNext:^(NSString * captchaTitle) {
  115. @strongify(self);
  116. [self.verifyView.verifyBtn setTitle:captchaTitle forState:UIControlStateNormal];
  117. }];
  118. /// 监听获取按钮的enable属性
  119. [[RACObserve(self.verifyView.verifyBtn, enabled) skip:1] subscribeNext:^(NSNumber * enabled) {
  120. @strongify(self);
  121. self.verifyView.verifyBtn.layer.borderColor = enabled.boolValue? RQColorFromHexString(@"#FA597E").CGColor : RQColorFromHexString(@"#C8C8C8").CGColor;
  122. }];
  123. /// show HUD
  124. [[[[RACSignal combineLatest:@[self.viewModel.sureCommand.executing , self.viewModel.captchaCommand.executing] reduce:^id(NSNumber *cExecuting , NSNumber * fExecuting){
  125. if (cExecuting.boolValue||fExecuting.boolValue) return @1;
  126. return @0;
  127. }]
  128. deliverOnMainThread] doNext:^(id x) {
  129. @strongify(self);
  130. [self.view endEditing:YES];
  131. }]
  132. subscribeNext:^(NSNumber * showHud) {
  133. @strongify(self);
  134. if (showHud.boolValue) {
  135. [MBProgressHUD rq_showProgressHUD:@"请稍后..."];
  136. }else if(!self.viewModel.error){
  137. [MBProgressHUD rq_hideHUD];
  138. }
  139. }];
  140. /// show errors
  141. [[self.viewModel.captchaCommand.errors merge:self.viewModel.sureCommand.errors] subscribeNext:^(NSError * error) {
  142. [MBProgressHUD rq_showErrorTips:error];
  143. }];
  144. }
  145. - (IBAction)sureBtnDidClicked:(id)sender {
  146. /// 验证码 六位 且必须是纯数字
  147. if(self.verifyView.verifyTextField.text.length != 6 || ![NSString rq_isPureDigitCharacters:self.verifyView.verifyTextField.text]){
  148. [NSObject rq_showAlertViewWithTitle:@"验证码超时,请重新获取验证码。" message:nil confirmTitle:@"确定"];
  149. return ;
  150. }
  151. [self.viewModel.sureCommand execute:@{RQCaptchaKey : self.verifyView.verifyTextField.text}];
  152. }
  153. @end