短信驗證碼倒計時 - 全局驗證碼

#import "LoginAndRegViewController.h"
#import "UserModel.h"
#import "GlobalModel.h"
#import "AccountTool.h"
#import "NSStringTool.h"
#import "AlertTool.h"
#import "HttpHeader.h"
#import "StringUtil.h"
#import <SSKeychain.h>
#import "UINavigationController+FDFullscreenPopGesture.h"
#import "NSDate+Utilities.h"

#define countDown 300
@interface LoginAndRegViewController ()
{
    // 倒計時時間
    NSInteger _time;
    // 全局模型
    GlobalModel *_globalModel;
    AccountTool *_accountTool;
}
@property (nonatomic, strong) NSTimer *timer;
// 手機號碼Field
@property (weak, nonatomic) IBOutlet UITextField *phoneNumTF;
// 驗證碼Field
@property (weak, nonatomic) IBOutlet UITextField *checkCodeTF;
// 獲取驗證碼按鈕
@property (weak, nonatomic) IBOutlet UIButton *checkCodeBtn;
// 登錄按鈕
@property (weak, nonatomic) IBOutlet UIButton *loginBtn;
@end

@implementation LoginAndRegViewController
#pragma mark - view life circle  viewController生命周期方法
- (void)viewDidLoad {
    [super viewDidLoad];
    [self prepareUI];
    self.navigationController.fd_fullscreenPopGestureRecognizer.enabled = NO;
}

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self.navigationController setNavigationBarHidden:NO];
    if (self.isHiddenBackBtn) {
        self.backBtn.hidden = YES;
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

#pragma mark - custom methods  自定義方法
- (void)prepareUI{
    
    self.title = @"登錄";
    
    _globalModel = [GlobalModel sharedGlobalModel];
    _accountTool = [[AccountTool alloc] init];
    
    self.loginBtn.enabled = NO;

    if ([_accountTool getPhoneNum] != nil) {// 手機號碼不為空
        self.phoneNumTF.text = [_accountTool getPhoneNum];
        if ([_accountTool getUserToken]) {
            [self requestDataWithLogin];
        }
    }
    
    // 監(jiān)聽TextField.text改變
    [self.phoneNumTF addTarget:self action:@selector(textfieldDidChangedText:) forControlEvents:UIControlEventEditingChanged];
    [self.checkCodeTF addTarget:self action:@selector(checkCodeTFDidChangedText:) forControlEvents:UIControlEventEditingChanged];
    
    if (_globalModel.codeDate) {
        NSInteger countDownSec = [_globalModel.codeDate distanceInSecondsToDate:[NSDate date]];
        if (countDownSec < countDown) {
            // 驗證碼時間內(nèi)
            self.checkCodeBtn.enabled = NO;
            _time = countDown - countDownSec;
            self.checkCodeBtn.titleLabel.text = [NSString stringWithFormat:@"%zi秒", _time];
            [self.checkCodeBtn setTitle:[NSString stringWithFormat:@"%zi秒", _time] forState:UIControlStateNormal];
            
            self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeDown) userInfo:nil repeats:YES];
            return;
        }else{
            // 驗證碼時間外
            _time = countDown;
        }
    }
    _time = countDown;
}

- (void)timeDown
{
    _time --;
    
    if (_time == 0) {
        self.checkCodeBtn.titleLabel.text = @"重新獲取";
        [self.checkCodeBtn setTitle:@"重新獲取" forState:UIControlStateNormal];
        self.checkCodeBtn.enabled = YES;
        
        [_timer invalidate];
        _timer = nil;
        _time = countDown;
        return;
    }
    self.checkCodeBtn.titleLabel.text = [NSString stringWithFormat:@"%zi秒", _time];
    [self.checkCodeBtn setTitle:[NSString stringWithFormat:@"%zi秒", _time] forState:UIControlStateNormal];
    
}

//
- (void)textfieldDidChangedText:(UITextField *)textfield{
    if (textfield.text.length == 11 && [StringUtil isMobile:textfield.text] && self.checkCodeTF.text.length != 0) {
        self.loginBtn.enabled = YES;
    }else{
        self.loginBtn.enabled = NO;
    }
}

- (void)checkCodeTFDidChangedText:(UITextField *)textfield{
    if (self.checkCodeTF.text.length != 0) {
        self.loginBtn.enabled = YES;
    }else{
        self.loginBtn.enabled = NO;
    }
}

#pragma mark 按鈕響應(yīng)
// 登錄按鈕
- (IBAction)loginBtnDidClick:(UIButton *)sender {
    // 校驗
    if (![StringUtil isMobile:self.phoneNumTF.text]) {
        [AlertTool alertWithTipStr:@"手機號碼錯誤,請重新輸入"];
        return;
    }
    
    // keychain中保存的賬戶數(shù)組
    NSArray *accountArr = [SSKeychain accountsForService:KeychainService];
    for (NSDictionary *dict in accountArr) {
        // 判斷賬戶數(shù)組的賬戶是否與textField中的相匹配
        if ([dict[@"acct"] isEqualToString:self.phoneNumTF.text]) {
            // keychain中保存過
            [self requestDataWithLogin];
        }
    }
    // keychain中沒保存過
    [self requestDataWithReg];
}

// 獲取驗證碼按鈕
- (IBAction)checkCodeBtnDidClick:(UIButton *)sender {
    // 驗證手機號碼
    if (![StringUtil isMobile:self.phoneNumTF.text]) {
        [AlertTool alertWithTipStr:@"手機號碼錯誤,請重新輸入"];
        return;
    }
    self.checkCodeBtn.enabled = NO;
    self.checkCodeBtn.titleLabel.text = [NSString stringWithFormat:@"%zi秒", _time];
    [self.checkCodeBtn setTitle:[NSString stringWithFormat:@"%zi秒", _time] forState:UIControlStateNormal];
    
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeDown) userInfo:nil repeats:YES];
    _globalModel.codeDate = [NSDate date];
    // 驗證碼請求
    [self requestDataWithValidCode];
    
}
#pragma mark 網(wǎng)絡(luò)請求

#pragma mark - sources and delegates 代理庶诡、協(xié)議方法

#pragma mark - getters and setters 屬性的設(shè)置和獲取方法

-(void)dealloc{
    [self.timer invalidate];
    self.timer = nil;
}
@end

NSDateUtils
https://github.com/hychen1024/NSDateUtils

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陡鹃,一起剝皮案震驚了整個濱河市甜癞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異灾炭,居然都是意外死亡,警方通過查閱死者的電腦和手機颅眶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門蜈出,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涛酗,你說我怎么就攤上這事铡原。” “怎么了商叹?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵燕刻,是天一觀的道長。 經(jīng)常有香客問我剖笙,道長卵洗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任弥咪,我火速辦了婚禮过蹂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘聚至。我一直安慰自己酷勺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布扳躬。 她就那樣靜靜地躺著脆诉,像睡著了一般甚亭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上击胜,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天亏狰,我揣著相機與錄音,去河邊找鬼潜的。 笑死骚揍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的啰挪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嘲叔,長吁一口氣:“原來是場噩夢啊……” “哼亡呵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起硫戈,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锰什,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后丁逝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汁胆,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年霜幼,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫩码。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡罪既,死狀恐怖铸题,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琢感,我是刑警寧澤丢间,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站驹针,受9級特大地震影響烘挫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜柬甥,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一饮六、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暗甥,春花似錦喜滨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春辜膝,著一層夾襖步出監(jiān)牢的瞬間无牵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工厂抖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茎毁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓忱辅,卻偏偏與公主長得像七蜘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子墙懂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容