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