Swift實(shí)現(xiàn)iOS應(yīng)用中短信驗(yàn)證碼倒計(jì)時(shí)功能的實(shí)例分享
在開始之前,我們先來(lái)了解一個(gè)概念 屬性觀測(cè)器(Property Observers):
屬性觀察器監(jiān)控和響應(yīng)屬性值的變化,每次屬性被設(shè)置值的時(shí)候都會(huì)調(diào)用屬性觀察器,甚至新的值和現(xiàn)在的值相同的時(shí)候也不例外。
可以為屬性添加如下的一個(gè)或全部觀察器:
- willSet在新的值被設(shè)置之前調(diào)用
- didSet在新的值被設(shè)置之后立即調(diào)用
接下來(lái)開始我們的教程,先展示一下最終效果:

首先聲明一個(gè)發(fā)送按鈕:
var sendButton: UIButton!
在viewDidLoad方法中給發(fā)送按鈕添加屬性:
override func viewDidLoad() {
super.viewDidLoad()
sendButton = UIButton()
sendButton.frame = CGRect(x: 40, y: 100, width: view.bounds.width - 80, height: 40)
sendButton.backgroundColor = UIColor.redColor()
sendButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
sendButton.setTitle("獲取驗(yàn)證碼", forState: .Normal)
sendButton.addTarget(self, action: "sendButtonClick:", forControlEvents: .TouchUpInside)
self.view.addSubview(sendButton)
}
接下來(lái)聲明一個(gè)變量remainingSeconds代表當(dāng)前倒計(jì)時(shí)剩余的秒數(shù):
var remainingSeconds = 0
我們給remainingSeconds添加一個(gè)willSet方法,這個(gè)方法會(huì)在remainingSeconds的值將要變化的時(shí)候調(diào)用,并把值傳遞給參數(shù)newValue:
var remainingSeconds: Int = 0 {
willSet {
sendButton.setTitle("驗(yàn)證碼已發(fā)送(\(newValue)秒后重新獲取)", forState: .Normal)
if newValue <= 0 {
sendButton.setTitle("重新獲取驗(yàn)證碼", forState: .Normal)
isCounting = false
}
}
}
當(dāng)remainingSeconds變化時(shí)更新sendButton的顯示文本。
倒計(jì)時(shí)的功能我們用NSTimer實(shí)現(xiàn),先聲明一個(gè)NSTimer實(shí)例:
var countdownTimer: NSTimer?
然后我們聲明一個(gè)變量來(lái)開啟和關(guān)閉倒計(jì)時(shí):
var isCounting = false {
willSet {
if newValue {
countdownTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTime", userInfo: nil, repeats: true)
remainingSeconds = 10
sendButton.backgroundColor = UIColor.grayColor()
} else {
countdownTimer?.invalidate()
countdownTimer = nil
sendButton.backgroundColor = UIColor.redColor()
}
sendButton.enabled = !newValue
}
}
同樣,我們給isCounting添加一個(gè)willSet方法,當(dāng)isCounting的newValue為true時(shí),我們通過(guò)調(diào)用NSTimer的類方法
scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:創(chuàng)建并啟動(dòng)剛才聲明的countdownTimer實(shí)例,這個(gè)實(shí)例每一秒鐘調(diào)用一次updateTime:方法:
func updateTime(timer: NSTimer) {
// 計(jì)時(shí)開始時(shí),逐秒減少remainingSeconds的值
remainingSeconds -= 1
}
當(dāng)isCounting的newValue為false時(shí),我們停止countdownTimer并將countdownTimer設(shè)置為nil。
此外我們還設(shè)置了倒計(jì)時(shí)的時(shí)間(這里為了演示時(shí)間設(shè)置為5秒)和發(fā)送按鈕在不同isCounting狀態(tài)下的樣式(這里調(diào)整了背景色)和是否可點(diǎn)擊。
最后實(shí)現(xiàn)sendButtonClick:方法,這個(gè)方法在點(diǎn)擊sendButton時(shí)調(diào)用:
func sendButtonClick(sender: UIButton) {
// 啟動(dòng)倒計(jì)時(shí)
isCounting = true
}
完成!
相關(guān)文章
iOS開發(fā)項(xiàng)目- 基于WebSocket的聊天通訊(1)
這篇文章主要介紹了iOS開發(fā)項(xiàng)目- 基于WebSocket的聊天通訊,WebSocket是web通信方式的一種,有需要的可以了解一下。2016-11-11
iOS 使用Moya網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)方法
這篇文章主要介紹了iOS 使用Moya網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
UICollectionView 實(shí)現(xiàn)圖片瀏覽效果
這篇文章主要為大家介紹了UICollectionView 實(shí)現(xiàn)圖片瀏覽效果示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
NSString屬性何時(shí)用strong何時(shí)用copy?
相信各位iOS開發(fā)者們都考慮過(guò)這個(gè)問(wèn)題,平時(shí)寫NSString的屬性時(shí)都用copy,那strong要何時(shí)用呢?下面這篇文章就來(lái)看一下什么時(shí)候應(yīng)該用copy,什么時(shí)候應(yīng)該用strong。有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-12-12
iOS和JS交互教程之WKWebView-協(xié)議攔截詳解
這篇文章主要給大家介紹了關(guān)于iOS和JS交互教程之WKWebView-協(xié)議攔截的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09
詳解Objective-C編程中對(duì)設(shè)計(jì)模式中適的配器模式的使用
這篇文章主要介紹了Objective-C編程中對(duì)設(shè)計(jì)模式中適的配器模式的使用,適配器模式中的Adapter適配器允許接口不兼容的類在一起工作,需要的朋友可以參考下2016-03-03

