今天写项目需要写一个发送验证码的功能,点击按钮之后就有60秒时间是禁用的,然后按钮上显示到计时时间
下面我展示两种方法
一、通过线程实现
在按钮的点击方法里面实现如下代码
[self.GetTheVerificationNumButton setTitle:@"60S" forState:UIControlStateNormal];
[self.GetTheVerificationNumButton setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
__block int timeout=59; //倒计时时间
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(), ^{
//设置界面的按钮显示 根据自己需求设置
[_GetTheVerificationNumButton setTitle:@"发送验证码" forState:UIControlStateNormal];
_GetTheVerificationNumButton.userInteractionEnabled = YES;
});
}else{
int seconds = timeout % 60;
NSString *strTime = [NSString stringWithFormat:@"%.2d", seconds];
dispatch_async(dispatch_get_main_queue(), ^{
//设置界面的按钮显示 根据自己需求设置
//NSLog(@"____%@",strTime);
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1];
[_GetTheVerificationNumButton setTitle:[NSString stringWithFormat:@"%@",strTime] forState:UIControlStateNormal];
[UIView commitAnimations];
_GetTheVerificationNumButton.userInteractionEnabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
二 、 通过计时器实现
@interface ForgatePwViewController ()<UITextFieldDelegate>
@property int secondsCountDown; //倒计时总时长
@property NSTimer *countDownTimer;
@end
- (IBAction)GetTheVerificationcode:(id)sender {
[_GetTheVerificationNumButtonsetTitle:[NSStringstringWithFormat:@"60S后重发"]forState:UIControlStateNormal];
[_GetTheVerificationNumButtonsetTitleColor:[UIColorgrayColor] forState:UIControlStateNormal];
//设置倒计时总时长
_secondsCountDown =60;//60秒倒计时
//开始倒计时
_countDownTimer = [NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(timeFireMethod)userInfo:nilrepeats:YES];//启动倒计时后会每秒钟调用一次方法 timeFireMethod
_GetTheVerificationNumButton.userInteractionEnabled =NO;
}
-(void)timeFireMethod{
//倒计时-1
_secondsCountDown--;
//当倒计时到0时,做需要的操作,比如验证码过期不能提交
if(_secondsCountDown>0){
//修改倒计时标签现实内容
[_GetTheVerificationNumButtonsetTitle:[NSStringstringWithFormat:@"%dS后重发",_secondsCountDown]forState:UIControlStateNormal];
}else{
[_countDownTimerinvalidate];
[_GetTheVerificationNumButtonsetTitle:@"发送验证码"forState:UIControlStateNormal];
[_GetTheVerificationNumButtonsetTitleColor:[UIColorwhiteColor] forState:UIControlStateNormal];
_GetTheVerificationNumButton.userInteractionEnabled =YES;
}
}
如果发现按钮会闪烁,将UIButton的类型由system改为custom就OK