计时器失效后运行的条件

时间:2018-07-18 02:37:10

标签: swift

我目前有一个带有以下代码的计时器应用。我想知道一旦计时器到达00:00,如何编写条件(例如显示消息的标签)。这仅仅是一个简单的if语句吗?如果是这样,那看起来如何?

任何帮助将不胜感激。谢谢!

@IBOutlet weak var timerLabel: UILabel!
var countdownTimer: Timer!
var totalTime = 60
func startTimer() {
countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: 
#selector(updateTime), userInfo: nil, repeats: true)
}
@objc func updateTime() {
timerLabel.text = "\(timeFormatted(totalTime))"

if totalTime != 0 {
        totalTime -= 1
    } else {
        endTimer()
    }
}
func endTimer() {
    countdownTimer.invalidate()
}
func timeFormatted(_ totalSeconds: Int) -> String {
    let seconds: Int = totalSeconds % 60
    let minutes: Int = (totalSeconds / 60) % 60
    return String(format: "%02d:%02d", minutes, seconds)
}

1 个答案:

答案 0 :(得分:0)

据我们所知,在您的代码中,可以从外部调用endTimer来停止计时器。所以那不是最佳位置。

  • 我会将endTimer重命名为timeIsUp或类似名称,并将此回调设为私有(以确保您不会从其他任何地方调用它。
  • 使用public func stopTimer()来使计时器无效。
  • stopTimer致电timeIsUp

因此timeIsUp将是您发送消息的地方。

除了这种重构建议之外,在您当前的代码中,我会将消息内容放入else { endTimer() }代码块中,因为这是满足您的“时间到了”条件的地方。

@IBOutlet weak var timerLabel: UILabel!
var countdownTimer: Timer!
var totalTime = 60
func startTimer() {
    countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}

@objc func updateTime() {
    timerLabel.text = "\(timeFormatted(totalTime))"

    if totalTime != 0 {
        totalTime -= 1
    } else {
        // ⬅️ put the message code here
        endTimer()
    }
}
func endTimer() {
    countdownTimer.invalidate()
}
func timeFormatted(_ totalSeconds: Int) -> String {
    let seconds: Int = totalSeconds % 60
    let minutes: Int = (totalSeconds / 60) % 60
    return String(format: "%02d:%02d", minutes, seconds)
}