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分钟的新倒计时进行重置。