開(kāi)發(fā)中不可避免會(huì)用到注冊(cè)獲取驗(yàn)證碼,在驗(yàn)證碼定時(shí)器使用方面別出心裁,各有妙招,今天推薦一個(gè)比較實(shí)用的定時(shí)器使用方法,特做了一個(gè)封裝。
// KTimeCountDown.swift
import UIKit
//設(shè)置一個(gè)靜態(tài)的時(shí)間范圍,以便更改
private let kCodeTime = 60
class KTimeCountDown {
//定義一個(gè)私有定時(shí)器變量
private var codeTimer: Timer?
//初始化一個(gè)UIButton供外部使用及定時(shí)器時(shí)間處理
var codeBtn = UIButton()
//定義一個(gè)定時(shí)剩余時(shí)間, 默認(rèn)為0
private var countDownTime: Int = 0 {
willSet{
//事件不為0 isCountDown的狀態(tài)始終未true
codeBtn.setTitle("重新獲取\(newValue)秒", for: .normal)
//事件小于等于0 isCountDown的狀態(tài)改變 按鈕重置
if newValue <= 0 {
codeBtn.setTitle("獲取驗(yàn)證碼", for: .normal)
isCountDown = false
}
}
}
//定義一個(gè) 是否正在倒計(jì)時(shí)的狀態(tài)
var isCountDown = false {
willSet {
if newValue {
//創(chuàng)建定時(shí)器
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 ,銷毀定時(shí)器
codeTimer?.invalidate()
codeTimer = nil
//按鈕狀態(tài)改變 重置
codeBtn.setTitleColor(UIColor.brown, for: .normal)
codeBtn.setTitle("獲取驗(yàn)證碼", for: .normal)
}
//如果isCountDown為true ,禁用按鈕事件
codeBtn.isEnabled = !newValue
}
}
@objc private func countDownTimeAction() {
countDownTime -= 1
}
}
使用方法
import UIKit
import SnapKit
class RegisterViewController: UIViewController {
var countDown = KTimeCountDown()//實(shí)例化
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("獲取驗(yàn)證碼", for: .normal)
codeBtn.setTitleColor(UIColor.brown, for: .normal)
}
//開(kāi)啟定時(shí)器
func codeBtnClick(_ sender: UIButton){
//只需要調(diào)此方法
countDown.isCountDown = true
}
//取消定時(shí)器
@IBAction func backBtnClick(_ sender: Any) {
//只需要調(diào)此方法
countDown.isCountDown = false
}
}