xcode 10.1: таймер останавливается на 1, а не на 0 - PullRequest
0 голосов
/ 02 апреля 2020

Да, я видел несколько вопросов, похожих на мои, но по какой-то причине я не смог продублировать их! Если я использую == или <= с, если оба дают мне остановку на 1. Только <дал мне 0 остановок, которые хороши, но очень редко я получил -1. Любая помощь, пожалуйста? </p>

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var timeLabel: UILabel!
    @IBOutlet weak var startButton: UIButton!

    var timer = Timer()
    var timeLeft = 10

    override func viewDidLoad() {
        timeLabel.text = String(10)
        super.viewDidLoad()
    }

    @IBAction func pressTimer(_ sender: Any) {
        startButton.isEnabled = false
        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(startTime), userInfo: nil, repeats: true)
    }

    @objc func startTime() {
        timeLeft -= 1
        timeLabel.text = "\(timeLeft)"

        if timeLeft < 0 {
            startButton.isEnabled = false
            self.timer.invalidate() 
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Я предлагаю объявить таймер как опциональный и проверить на ноль до уменьшения счетчика.

И установить счетчик на 10 в методе pressTimer

class ViewController: UIViewController {

    @IBOutlet weak var timeLabel: UILabel!
    @IBOutlet weak var startButton: UIButton!

    var timer : Timer?

    var timeLeft = 0

    @IBAction func pressTimer(_ sender: Any) {
        startButton.isEnabled = false
        timeLeft = 10
        timeLabel.text = String(timeLeft)
        if timer == nil {
            timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(startTime), userInfo: nil, repeats: true)
        }
    }

    @objc func startTime()
    {
        if timeLeft == 0 {
            startButton.isEnabled = false // shouldn't it be true??
            timer?.invalidate()
            timer = nil
        } else {
            timeLeft -= 1
            timeLabel.text = String(timeLeft)
        }
    }
}
0 голосов
/ 02 апреля 2020

Я предложу включить таймер в прогон l oop также, если вы хотите, вы можете использовать закрытие для таймера.

class ViewController: UIViewController {    
    @IBOutlet weak var timeLabel: UILabel!
    @IBOutlet weak var startButton: UIButton!

    var timer = Timer()
    var timeLeft = 10

    override func viewDidLoad() {
        super.viewDidLoad()
        timeLabel.text = String(10)
    }

    @IBAction func pressTimer(_ sender: Any) {
        startButton.isEnabled = false
        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
            timeLeft -= 1
            self.timeLabel.text = "\(timeLeft)"

            if timeLeft <= 0 {
                self.startButton.isEnabled = false
                self.timer.invalidate()
            }
            RunLoop.current.add(timer, forMode: RunLoop.Mode.common)
        }
    }
}
...