当按下启动它的按钮多次时,倒计时会加速

时间:2018-03-27 00:27:44

标签: swift

我刚开始学习迅捷。当我按下按钮两次时,我发现当使用按钮开始倒计时时加速了这个过程。要添加什么来防止这种情况?

@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)
    }
    }

3 个答案:

答案 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
    }
}