Этикетка с таймером не останавливается - PullRequest
0 голосов
/ 11 июля 2020

Я создаю секундомер, и у меня возникают проблемы с остановкой таймера при нажатии кнопки «СТОП». Я могу сбросить текст до 0, но таймер продолжает работать, и если я снова нажму кнопку «Пуск», таймер будет работать так, как будто я никогда не нажимал кнопку «Стоп».

Код таймера:

    func goTimer()
    {
      if timer == nil {
        timer = Timer.scheduledTimer(timeInterval : 0.1,
                                     target : self,
                                     selector :#selector(timerAction(_:)),
                                     userInfo: nil, repeats: true);
      }
    }

    func stopTimer()
    {
      if timer != nil {
        timer!.invalidate()
        timer = nil
      }
    }
    
    func updateTimer() {
        let intervalTotal = -Int(startDate.timeIntervalSinceNow)
        let hours = intervalTotal / 3600
        let minutes = intervalTotal / 60 % 60
        let seconds = intervalTotal  % 60
        
        if startButton.currentTitle == "STOP" {
            totalTime.text = String(format: "%02i:%02i:%02i", hours, minutes, seconds)
            lapTime.text = String(format: "%02i:%02i:%02i", hours, minutes, seconds)
        }
 }

    @objc func timerAction (_ timer : Timer) {
        print("timerAction(_:)")
        self.updateTimer()
    }



    @IBAction func startTimer(_ sender: Any) {
        
        if startButton.currentTitle == "STOP" {
            startButton.backgroundColor = UIColor.systemGreen
            startButton.setTitle("START", for : .normal)
            stopTimer()
            lapTime.text = "00:00:00"
        }
        else if startButton.currentTitle == "START" {
            startButton.backgroundColor = UIColor.systemRed
            startButton.setTitle("STOP", for : .normal)
            goTimer()
            lapButton.isEnabled = true
            lapButton.backgroundColor = UIColor.systemBlue
        }
    }

1 Ответ

0 голосов
/ 11 июля 2020

let intervalTotal = -Int(startDate.timeIntervalSinceNow)

Я не вижу, чтобы вы сбрасывали это startDate в своей функции stopTimer().

у вас есть переменная var startDate: Date = Date() где-то в верхней части вашего кода. Если это не переменная (если это разрешено), измените ее на переменную. Вы хотите установить это значение при запуске таймера. поэтому

func goTimer() {
    // Add this to set the date to when your function starts
    startDate = Date()
    ....
}

Это потому, что, когда вы устанавливаете значение в своей метке здесь

func updateTimer() {
    let intervalTotal = -Int(startDate.timeIntervalSinceNow)
    ....
}

, вы устанавливаете значение от startDate до

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...