如何在Swift中设置多个后续倒数计时器

时间:2018-12-27 09:53:29

标签: swift timer

首先,我通常要在计时器上构建程序的功能,该功能将提醒您指定的休息时间等。该程序用于集中精力。

保存所有我们在一开始设置的变量时,按下按钮时,计时器应启动。它必须执行我们之前设置的特定周期(周期)。

但是在执行完全相同的周期时出现了问题。似乎所有变量都已保存,但是标签为何不更改它们... 理想情况下,您应该先运行工作->短暂休息->工作->短暂休息->工作->短暂休息->工作->短暂休息->短暂休息,然后根据数量重复已安装周期。但是出于某种原因,我有工作->短暂休息->短暂休息...

我只是想听听您关于我的错误可能是什么以及如何解决的意见?

对于我的“代码”,我不了解,也不要责骂。现在我只想学习如何写作并理解我在写什么。随着时间的推移,代码当然会更好。

我的应用如下:

The user interface for the timer app. It shows several text fields for various time intervals and a timer displaying the current interval.

import UIKit

class ViewController: UIViewController {

    var time: Int = 0
    var timer = Timer()

    var min: Int = 0
    var sec: Int = 0

    @IBOutlet weak var shortBreakLabel: UITextField!
    @IBOutlet weak var longBreakLabel: UITextField!
    @IBOutlet weak var workLabel: UITextField!
    @IBOutlet weak var cyclesLabel: UITextField!

    @IBOutlet weak var goButton: UIButton!

    @IBOutlet weak var minutesLabel: UILabel!
    @IBOutlet weak var secondsLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        shortBreakLabel.text = String(5)
        longBreakLabel.text = String(15)
        workLabel.text = String(25)
        cyclesLabel.text = String(16)

        saveTimer()

        goButton.layer.cornerRadius = 10
    }

    //GoButton pressed
    @IBAction func goButtonAction(_ sender: UIButton) {
        timerFunc()
    }

    func timerFunc() {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerDidEndend), userInfo: nil, repeats: true)
    }

    @objc private func timerDidEndend() {
        if (time > 0) {
        time -= 1
        updateUI()
        } else {
            timer.invalidate()
        }

       changeTimeToShortBreak()
        changeTimeToWork()
        changeTimeToShortBreak()

    }

    private func updateUI() {
        min = (time/60) % 60
        sec = time % 60

        minutesLabel.text = String(min)
        secondsLabel.text = String(sec)
    }

    func changeTimeToShortBreak() {
        if time == 0 {
            timer.invalidate()
            minutesLabel.text = shortBreakLabel.text
            time = Int(minutesLabel.text!)! * 60
            timerFunc()
        }
    }

    func changeTimeToWork() {
        if time == 0 {
            timer.invalidate()
            minutesLabel.text = workLabel.text
            time = Int(minutesLabel.text!)! * 60
            timerFunc()
        }
    }

    func saveTimer() {
        minutesLabel.text = workLabel.text
        time = Int(minutesLabel.text!)! * 60
    }

    //Hide keyboard function
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        saveTimer()
        self.view.endEditing(true)
    }

}

1 个答案:

答案 0 :(得分:0)

您这里确实有2或3种不同的情况:

  1. 允许用户设置时间间隔
  2. 显示从上一个/到下一个间隔的时间
  3. 跟踪时间以了解您当前处于或即将进入的状态

我将其分为2类-状态类和UI类。状态类仅包含一组时间间隔,并指示您正在使用哪个时间间隔。像这样:

var timeIntervals = [ kDefaultWorkInterval, kDefaultShortBreakInterval, kDefaultWorkInterval, kDefaultShortBreakInterval, kDefaultWorkInterval, kDefaultShortBreakInterval, kDefaultWorkInterval, kDefaultShortBreakInterval, kDefaultLongBreakInterval ]
var currentInterval = 0
var timer = Timer()

您无需将计时器设置为每秒触发一次,只需将其设置为timeIntervals [ currentInterval ]元素中的时间即可。触发时,增加currentInterval,获取该间隔的时间间隔,然后将计时器设置为在该秒内触发。

接下来,在您的UI类中,不要轮询文本字段的更改。设置UI类(您的ViewController)以在文本字段被编辑后接收来自它们的通知。这样,仅在用户实际更改状态对象的时间间隔后,才需要更新它们。这比每秒更改一次效率更高。发生这种情况时,请在状态类上调用setter来更新时间间隔。

我会将1秒计时器保留在ViewController中,并简单地使用它来更新倒计时,而无需执行其他操作。