开发中不可避免会用到注册获取验证码,在验证码定时器使用方面别出心裁,各有妙招,今天推荐一个比较实用的定时器使用方法,特做了一个封装。
// KTimeCountDown.swift
import UIKit
//设置一个静态的时间范围,以便更改
private let kCodeTime = 60
class KTimeCountDown {
//定义一个私有定时器变量
private var codeTimer: Timer?
//初始化一个UIButton供外部使用及定时器时间处理
var codeBtn = UIButton()
//定义一个定时剩余时间, 默认为0
private var countDownTime: Int = 0 {
willSet{
//事件不为0 isCountDown的状态始终未true
codeBtn.setTitle("重新获取\(newValue)秒", for: .normal)
//事件小于等于0 isCountDown的状态改变 按钮重置
if newValue <= 0 {
codeBtn.setTitle("获取验证码", for: .normal)
isCountDown = false
}
}
}
//定义一个 是否正在倒计时的状态
var isCountDown = false {
willSet {
if newValue {
//创建定时器
codeTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(countDownTimeAction), userInfo: nil, repeats: true)
countDownTime = kCodeTime
codeBtn.setTitleColor(UIColor.lightGray, for: .normal)
} else {
//如果isCountDown为false ,销毁定时器
codeTimer?.invalidate()
codeTimer = nil
//按钮状态改变 重置
codeBtn.setTitleColor(UIColor.brown, for: .normal)
codeBtn.setTitle("获取验证码", for: .normal)
}
//如果isCountDown为true ,禁用按钮事件
codeBtn.isEnabled = !newValue
}
}
@objc private func countDownTimeAction() {
countDownTime -= 1
}
}
使用方法
import UIKit
import SnapKit
class RegisterViewController: UIViewController {
var countDown = KTimeCountDown()//实例化
var codeBtn = UIButton()//初始化
override func viewDidLoad() {
super.viewDidLoad()
//不带参
// codeBtn.addTarget(self, action: #selector(codeBtnClick) for: .touchUpInside)
codeBtn.addTarget(self, action: #selector(codeBtnClick(_:)), for: .touchUpInside)
view.addSubview(codeBtn)
codeBtn.snp.makeConstraints { (make) in
make.center.equalTo(self.view);
make.width.equalTo(200)
make.height.equalTo(40)
}
//赋值
countDown.codeBtn = codeBtn
codeBtn.setTitle("获取验证码", for: .normal)
codeBtn.setTitleColor(UIColor.brown, for: .normal)
}
//开启定时器
func codeBtnClick(_ sender: UIButton){
//只需要调此方法
countDown.isCountDown = true
}
//取消定时器
@IBAction func backBtnClick(_ sender: Any) {
//只需要调此方法
countDown.isCountDown = false
}
}
网友评论