swift3,我的计时器无法停止。为什么?

时间:2017-12-07 09:02:26

标签: ios swift

这是我设置一个计时器功能,代码如下:

@IBAction func start(_ sender: UIButton) {

    Timer.scheduledTimer(timeInterval: 1,
                         target: self,
                         selector:#selector(ViewController.action),
                         userInfo: nil,
                         repeats: true)
}

@objc func action() {

    hoursMinutesSeconds()
    if stop == true{
        start = false
        timer.invalidate()
        timer.invalidate()
        time = 0 
    }
}

@IBAction func stop(_ sender: UIButton){

    start = false
    timer.invalidate()
    timer.invalidate()
    time = 0           
}

但是,当我点击停止功能时,此功能无效。意思是计时器不停。定时器stil工作......为什么?谢谢你的时间!!

4 个答案:

答案 0 :(得分:3)

我认为你没有设置timer

timer = Timer.scheduledTimer(timeInterval: 1,
                         target: self,
                         selector:#selector(ViewController.action),
                         userInfo: nil,
                         repeats: true)

答案 1 :(得分:0)

确保您使Timer的正确实例无效。 与start function中一样,您没有将计时器实例分配给任何对象,但在stop function中,您使用timer vaiable来停止该计时器。 这意味着您尝试使一个从未实例化的变量无效。

仍然尝试以下功能停止计时器,分配计时器变量

@IBAction func stop(_ sender: UIButton) {

       start = false
       timer.invalidate()
       timer = nil
       time = 0
    }

希望这项工作

答案 2 :(得分:0)

首先,您必须将其声明为fileprivate,如下所示:

fileprivate var timer = Timer()

@IBAction func start(_ sender: UIButton) {

        self.timer = Timer.scheduledTimer(timeInterval: 4,
                                                      target: self,
                                                      selector: #selector(self.updateTimerForLocation),
                                                      userInfo: nil,
                                                      repeats: true)

}

@IBAction func stop(_ sender: UIButton) {

   timer.invalidate()


}

答案 3 :(得分:0)

你在变量停止和func stop之间感到困惑。
你也不需要2个参数来管理停止/启动状态

- 对于你的问题, 你应该保留timer变量,以便能够在其他函数中使用它 声明全局计时器

var timer: Timer!

然后

timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector:#selector(ViewController.action), userInfo: nil, repeats: true)

现在您可以在任何地方使其无效