我正在尝试重复此功能,因此它会一直重复,直到有人在接口上停止它,但当它返回到increaseTimer()时,它会出现错误:线程1:EXC_BAD_ACCESS。请有人帮忙,这个功能会自动循环。
func increaseTimer() {
time += 1
if time > 2 && time < 4 {
timerLabel.text = "Hold"
} else if (time > 5 && time < 10) {
timerLabel.text = "Breathe out"
} else if (time > 11 && time < 14) {
timerLabel.text = "Hold"
} else { return increaseTimer()}
答案 0 :(得分:1)
不要尝试无限重复代码来模拟计时器。而是使用Timer
对象。下面的代码将启动一个计时器并每隔1秒调用一次提供的闭包。
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { timer in
increaseTimer()
})
如果要停止计时器,请拨打invalidate()
。
timer.invalidate()
为了在消息之间切换,请执行以下操作:
func updateMessage() {
time += 1
switch time {
case 0 ... 5:
timerLabel.text = "Hold"
case 6 ... 10:
timerLabel.text = "Breathe Out"
default:
time = 0
}
}
答案 1 :(得分:0)
每次需要重复代码块时,您总是可以重置Int时间。就像这样:
首先,我会声明我的计时器并将其初始值设置为0。
var timer : Timer = 0
然后将以下内容放在您想要启动计时器的任何位置。 (在@IBAction或任何地方)
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateMessage), userInfo: nil, repeats: true)
然后放置代码以在switch语句中重置时间变量。 (我会把它设置为1,因为这将是第11秒)
func updateMessage() {
time += 1
switch time {
case 1 ... 5:
timerLabel.text = "Hold"
case 6 ... 10:
timerLabel.text = "Breathe Out"
time = 0
case 11:
timerLabel.text = "Hold"
//Reset the time Int to start the loop again
time = 1
default:
break
}
}
请确保在不再需要时使计时器无效。
timer.invalidate()