iOS计时器
时间:2020-02-23 14:45:55 来源:igfitidea点击:
在本教程中,我们将讨论和实现Timer类。
我们将开发一个运行倒数计时器的iOS应用程序。
计时器
Timer类是按特定时间间隔触发方法的类。
要创建计时器:
Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(ViewController.updateTimer)), userInfo: nil, repeats: true)
上面的计时器每秒运行一次。
在选择器中传递的函数在每个timeInterval上触发。
将repeats设置为false意味着计时器将仅触发一次。
非重复计时器触发一次,然后自动使其自身无效。
Timer类取代了Swift中较早的NSTimer类。
在UserInfo中,我们可以传递一些另外的数据,以后可以从Timer实例中检索这些数据。
let context = ["user": "@anupam"] Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(myTimer), userInfo: context, repeats: true)
@objc func myTimer(timer: Timer) {
guard let context = timer.userInfo as? [String: String] else { return }
let user = context["user", default: "NA"]
print("Timer fired by \(user)!")
}
在UserInfo内部传递的数据是一个Dictionary。
要停止计时器,我们可以简单地调用:
timer.invalidate()
invalidate()停止计时器再次触发,并将计时器从运行循环中删除。
无需添加触发的选择器功能,而是可以在每次触发Timer时使用闭包来运行所需的操作。
_ = Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { timer in
label.isHidden = true
}
在下一部分中,我们将使用播放/暂停/重置按钮创建一个倒数计时器iOS应用程序。
另外,我们将格式化时间,以在标签中正确显示小时,分钟,秒。
项目情节提要
使用控件和拖动将用于按钮和标签的IBOutlet和用于按钮的IBAction连接到ViewController。
代码
下面给出了ViewController.swift的代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
@IBOutlet weak var playButton: UIButton!
@IBOutlet weak var pauseButton: UIButton!
var seconds = 60
var timer = Timer()
var hasTimerStarted = false
var isResumed = false
override func viewDidLoad() {
super.viewDidLoad()
self.pauseButton.isEnabled = false
}
func runTimer() {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(ViewController.updateTimer)), userInfo: nil, repeats: true)
self.pauseButton.isEnabled = true
}
@objc func updateTimer() {
if seconds String {
let hours = Int(time)/3600
let minutes = Int(time)/60 % 60
let seconds = Int(time) % 60
return String(format:"%02i:%02i:%02i", hours, minutes, seconds)
}
@IBAction func playClicked(_ sender: Any) {
if hasTimerStarted == false {
runTimer()
self.playButton.isEnabled = false
}
}
@IBAction func pauseClicked(_ sender: Any) {
if self.isResumed == false {
timer.invalidate()
hasTimerStarted = false
self.isResumed = true
self.pauseButton.setTitle("Resume",for: .normal)
} else {
runTimer()
self.isResumed = false
hasTimerStarted = true
self.pauseButton.setTitle("Pause",for: .normal)
}
}
@IBAction func resetClicked(_ sender: Any) {
timer.invalidate()
seconds = 360
myLabel.text = formattedTime(time: TimeInterval(seconds))
hasTimerStarted = false
isResumed = false
self.pauseButton.setTitle("Pause",for: .normal)
pauseButton.isEnabled = false
self.playButton.isEnabled = true
}
}
formattedTime函数是我们格式化要在标签上显示的时间的地方。
我们需要仔细切换"暂停"按钮文本并在其上保留一个标志,以检查其当前状态。
单击"重置"按钮后,所有内容都将停止并以6分钟的新倒计时进行重置。

