iOS开发技巧iOS DeveloperiOS小项目

iOS获取验证码按钮的简单实现

2016-10-25  本文已影响470人  静花寒

开发中,获取验证码的按钮应该比较常见,但大多app的验证码按钮都有一个小小的bug,开发者并不会在意,那就是:

当点击按钮后,按钮进入倒计时,此时用户选择不留在页面等待,跳转到其他页面,然后收到验证码后,再返回页面进行输入。那么,此时的按钮是否依旧在进行倒计时呢???

今天我就写了一个封装,解决一下这个bug。思想很简单:单例!
老规矩,没图说**,丢效果图:

sms1.gif sms2.gif

然后是具体实现的代码,拷贝就可以了😄

//
//  SmsButtonHandle.h
//  My Tool
//
//  Created by wuwj on 2016/10/25.
//  Copyright © 2016年 wuwj. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface SmsButtonHandle : NSObject
//验证码按钮单例封装
+ (instancetype)sharedSmsBHandle;

- (UIButton *)buttonWithFrame:(CGRect)frame title:(NSString *)title action:(SEL)action superVC:(UIViewController *)superVC;

- (void)startTimer;
@end
//
//  SmsButtonHandle.m
//  My Tool
//
//  Created by wuwj on 2016/10/25.
//  Copyright © 2016年 wuwj. All rights reserved.
//

#import "SmsButtonHandle.h"
#import "BaseDefinition.h"
@implementation SmsButtonHandle{
    NSTimeInterval timeInterval;
    UIButton *smsButton;
    NSString *authTitle;
    NSTimer *timer;
    BOOL isFired;
}

+ (instancetype)sharedSmsBHandle{
    static dispatch_once_t onceToken;
    static SmsButtonHandle *handle;
    
    dispatch_once(&onceToken, ^{
        handle = [[SmsButtonHandle alloc] init];
    });
    return handle;
}

- (UIButton *)buttonWithFrame:(CGRect)frame title:(NSString *)title action:(SEL)action superVC:(UIViewController *)superVC{
    [[SmsButtonHandle sharedSmsBHandle] timeInterval];
    smsButton = [UIButton buttonWithType:(UIButtonTypeCustom)];
    smsButton.frame = frame;
    [smsButton addTarget:superVC action:action forControlEvents:(UIControlEventTouchUpInside)];
    if ([[SmsButtonHandle sharedSmsBHandle] timeInterval] < 59) {
        [[SmsButtonHandle sharedSmsBHandle] startTimer];
    }else{
        [smsButton setTitle:title forState:(UIControlStateNormal)];
    }
    [[SmsButtonHandle sharedSmsBHandle] authTitle:title];
    [smsButton setTitleColor:[UIColor blackColor] forState:(UIControlStateNormal)];
    
    return smsButton;
}

- (NSString *)authTitle:(NSString *)title{
    if (!authTitle) {
        authTitle = title;
    }
    return authTitle;
}

- (NSTimeInterval)timeInterval{
    if (!timeInterval) {
        timeInterval = 59;
    }
    return timeInterval;
}

- (NSTimer *)timer{
    if (!timer) {
        timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
        [timer setFireDate:[NSDate distantFuture]];
    }
    return timer;
}

#pragma mark - Timer Action
- (void)timerAction{
    if (timeInterval >= 1) {
        [smsButton setTitle:[authTitle stringByAppendingString:[NSString stringWithFormat:@"(%@)",@(timeInterval--)]] forState:UIControlStateNormal];
        smsButton.backgroundColor = [UIColor lightGrayColor];
        smsButton.userInteractionEnabled = NO;
    }else{
        [self stopTimer];
        timeInterval = 59;
        authTitle = @"重新发送";
        smsButton.backgroundColor = UIColorFromRGB(0xe45e39);
        [smsButton setTitle:authTitle forState:UIControlStateNormal];
        smsButton.userInteractionEnabled = YES;
    }
}

#pragma mark - Private Method
- (void)startTimer{
    isFired = YES;
    [self.timer setFireDate:[NSDate date]];
}

- (void)stopTimer{
    if (timer) {
        [timer setFireDate:[NSDate distantFuture]];
        isFired = NO;
    }
}

- (void)endTimer{
    if (timer) {
        timeInterval = 59;
        isFired = NO;
        [timer invalidate];
        timer = nil;
    }
}

@end

之后的调用就十分简单方便了

- (void)viewWillAppear:(BOOL)animated{
    self.view.backgroundColor = [UIColor whiteColor];
    
    UIButton *button = [[SmsButtonHandle sharedSmsBHandle] buttonWithFrame:(CGRectMake(100, 100, 200, 100)) title:@"发送短信" action:@selector(buttonAction) superVC:self];
    [self.view addSubview:button ];
}
- (void)buttonAction{
    NSLog(@"按钮事件");
//此处可以先调接口,成功后再调此方法
    [[SmsButtonHandle sharedSmsBHandle] startTimer];
}

写个文章,浏览器都一直炸,不写了,跑路!!

上一篇 下一篇

猜你喜欢

热点阅读