我刚开始学习迅捷。当我按下按钮两次时,我发现当使用按钮开始倒计时时加速了这个过程。要添加什么来防止这种情况?
@IBAction func startButton(_ sender: Any) {
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(processTime), userInfo: nil, repeats: true)
}
@objc func processTime(){
if counter > 0 {
counter -= 1
timeLabel.text = "\(counter)"
}else {
timer.invalidate()
}
}
我尝试使用sender.isEnabled = false
它给出了这个错误(类型的值'任何'没有会员' isEnabled')
所以我这样做了:
@IBAction func startButton(_ sender: Any) {
if timer.isValid != true{
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(processTime), userInfo: nil, repeats: true)
}
}
答案 0 :(得分:0)
添加sender.isEnabled = false
,按一下按钮后再次无法点击
答案 1 :(得分:0)
在重新分配新计时器之前,您需要通过调用timer.invalidate()
使计时器无效。如果您将新的计时器实例分配给旧的计时器实例而不会失效,您将失去对它的引用,它将永远不会失效。
答案 2 :(得分:0)
很多方面,取决于你喜欢什么逻辑
基本上,您需要确保timer
仅启动一次,直到完成。
在以下示例中,我们仅在先前未初始化时启动timer
此外,当我们停止timer
时,我们明确地将其设置为nil
,以便在计时器完成后,以下逻辑再次起作用。
//globally declared as optional
var timer: Timer?
@IBAction func startButton(_ sender: Any) {
//check if timer is nil
if timer != nil {
//start timer only if timer is nil
timer = Timer.scheduledTimer(timeInterval: 1,
target: self,
selector: #selector(processTime),
userInfo: nil,
repeats: true)
}
}
@objc func processTime() {
if counter > 0 {
counter -= 1
timeLabel.text = "\(counter)"
}
else {
timer.invalidate()
//clear the timer
timer = nil
}
}