以前只是简单的做了下NSTimer事件,没有考虑退到后台之类的情况。
网上看有一些解决方案,只是觉得比较繁琐
灵光一闪,如果不用手动计时每秒time--,而是用时间戳来计算,能实现比较理想的效果,代码如下:
//点击发送短信验证码(开始计时)
- (IBAction)act:(UIButton *)sender {
_btn.userInteractionEnabled = NO;
//60秒后可重新发送验证码,故保存60秒之后的时间
_secondsNumber = [NSDate date].timeIntervalSince1970 + 60;
[_timer invalidate];
_timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(secondsAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
}
- (void)secondsAction {
//点击发送短信后第60秒 与 当前时间做差,获取倒计时
NSInteger now = [NSDate date].timeIntervalSince1970;
if (_secondsNumber - now > 0) {
_btn.userInteractionEnabled = NO;
[_btn setTitle:[NSString stringWithFormat:@"重新发送(%lds)", (long)_secondsNumber - now] forState:UIControlStateNormal];
} else {
[_timer invalidate];
_timer = nil;
_btn.enabled = YES;
_btn.userInteractionEnabled = YES;
[_btn setTitle:@"重新获取" forState:UIControlStateNormal];
}
}
不用考虑app进入后台timer不执行的问题,如果发现代码任何问题,欢迎评论指出b( ̄▽ ̄)d
网友评论