首先,我通常要在计时器上构建程序的功能,该功能将提醒您指定的休息时间等。该程序用于集中精力。
保存所有我们在一开始设置的变量时,按下按钮时,计时器应启动。它必须执行我们之前设置的特定周期(周期)。
但是在执行完全相同的周期时出现了问题。似乎所有变量都已保存,但是标签为何不更改它们... 理想情况下,您应该先运行工作->短暂休息->工作->短暂休息->工作->短暂休息->工作->短暂休息->短暂休息,然后根据数量重复已安装周期。但是出于某种原因,我有工作->短暂休息->短暂休息...
我只是想听听您关于我的错误可能是什么以及如何解决的意见?
对于我的“代码”,我不了解,也不要责骂。现在我只想学习如何写作并理解我在写什么。随着时间的推移,代码当然会更好。
我的应用如下:
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)
}
}
答案 0 :(得分:0)
您这里确实有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
中,并简单地使用它来更新倒计时,而无需执行其他操作。