美文网首页iOS技术集iOS学习开发iOS Developer
iOS 短信验证码倒计时按钮的实现

iOS 短信验证码倒计时按钮的实现

作者: Swift社区 | 来源:发表于2017-09-14 12:07 被阅读279次

    实现思路

    创建按钮, 添加点击方法;
    用NSTimer定时器, 每秒执行一次, 定时改变Button的title,改变Button的样式, 设置Button不可点击;
    若倒计时结束, 定时器关闭, 并改变Button的样式, 可以点击。

    在app开发中经常会遇到,输入手机号获取验证码的功能,下面就和大家分享一下,获取验证码倒计时的功能实现
    首先给大家看一下页面展示

    验证码获取页面
    1. 声明属性
      获取验证码的按钮属性声明
    @property(strong,nonatomic)UIButton *againBtn;
    
    1. 获取验证码按钮代码
      SCREEN_WIDTH 屏幕宽度
    //获取验证码按钮
        self.againBtn = [[UIButton alloc]initWithFrame:CGRectMake(SCREEN_WIDTH*2/3-35, 0, SCREEN_WIDTH/3+20, 50)];
        [_againBtn addTarget:self action:@selector(againBtn:) forControlEvents:UIControlEventTouchUpInside];
        self.againBtn.userInteractionEnabled = NO;
        [self messageTime];
        [_againBtn setTitleColor:ALLTextColor forState:0];
        [self.contentView addSubview:_againBtn];
    
    1. 按钮点击事件
    - (void)againBtn:(UIButton *)sender{
        //倒计时函数
        [self messageTime];
    }
    
    1. 倒计时函数
    - (void)messageTime {
    
        __block int timeout=60; //倒计时时间
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
        dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
        
        dispatch_source_set_event_handler(_timer, ^{
            if(timeout<=0){ //倒计时结束,关闭
                dispatch_source_cancel(_timer);
                dispatch_async(dispatch_get_main_queue(), ^{
                    //设置界面的按钮显示 根据自己需求设置
                    [self.againBtn setTitle:@"发送验证码" forState:UIControlStateNormal];
                    [_againBtn setTitleColor:[UIColor blackColor] forState:0];
                    self.againBtn.userInteractionEnabled = YES;
                });
            }else{
                int seconds = timeout % 61;
                NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
                dispatch_async(dispatch_get_main_queue(), ^{
                    //设置界面的按钮显示 根据自己需求设置
                    [UIView beginAnimations:nil context:nil];
                    [UIView setAnimationDuration:1];
                    [self.againBtn setTitle:[NSString stringWithFormat:@"(%@)重新发送",strTime] forState:UIControlStateNormal];
                    [_againBtn setTitleColor:ALLTextColor forState:0];
                    //To do
                    [UIView commitAnimations];
                    self.againBtn.userInteractionEnabled = NO;
                });
                timeout--;
            }
        });
        dispatch_resume(_timer);
        
    }
    

    补充说明:

    我是使用mob前端集成验证码,如果使用服务器端返回验证码,就需要进行网络异常处理和服务器返回错误处理。

    针对网络异常处理解决方法如下:

        //    网络监控句柄
        AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
        //要监控网络连接状态,必须要先调用单例的startMonitoring方法
        [manager startMonitoring];
        [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
            //根据情况进行判读处理
            if ((long)status == 0) {
               
            }else if ((long)status == 2){
                
            }
            //        status:
            //        AFNetworkReachabilityStatusUnknown          = -1,  未知
            //        AFNetworkReachabilityStatusNotReachable     = 0,   未连接
            //        AFNetworkReachabilityStatusReachableViaWWAN = 1,   3G
            //        AFNetworkReachabilityStatusReachableViaWiFi = 2,   无线连接
            //                    NSLog(@"%ldhahahhahh", (long)status);
        }];
    

    针对服务器返回错误:

    可以根据对服务器返回参数进行判断处理。

    希望可以帮助大家
    如果哪里有什么不对或者不足的地方,还望读者多多提意见或建议
    iOS技术交流群:668562416

    相关文章

      网友评论

      • 46d7472b2332:程序进入后台定时器停止了
        Swift社区:@46d7472b2332 是的,这个是进后台就停止了
      • 123打点滴:不建议这么用
        Swift社区:@东门兜 首先谢谢你的提议,我考虑到代码的可读性,只摘出关于验证码的代码,网络异常可以使用AFNetworkReachabilityManager进行判断;然后我是使用的mob前端集成验证码,所以服务器返回错误就没有考虑。我会针对这两点在文章中进行说明补充。
        123打点滴:@L展菲Q 考虑一下网络异常,或者服务端返回错误时的处理,你就明白了。
        Swift社区:说说看,有什么好的建议?

      本文标题:iOS 短信验证码倒计时按钮的实现

      本文链接:https://www.haomeiwen.com/subject/xmxdsxtx.html