如何使用NSTimer来更新标签的运行时间(以分钟和秒为单位)



我的计时器在倒计时,但我遇到了问题:

  1. 使计时器在达到0时连续重新启动
  2. 倒计时是这样的:4:00,3:59,3:58…而不是240239238

这是我的代码:

ViewController: UIViewController {
    @IBOutlet weak var incomeTimeLabel: UILabel!
    var timer: NSTimer!
    let startIncomeTime = 240
    var incomeTime = 240
    func startTimer() {
        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, 
                    selector: #selector(ViewController.timerStarted),
                    userInfo: nil, repeats:  true)
    }
    func timerStarted() {
        incomeTimer()
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        startTimer()
    }
    func incomeTimer() {
        if incomeTime > -1 {
            incomeTimeLabel.text = String(incomeTime--)
        } else if incomeTime == -1 {
            incomeTimeLabel.text = String(startIncomeTime)
        }
    }
}

我自学代码才几个月,但我觉得有一种更有效的方法可以做到这一点,所以如果你有其他建议,我将不胜感激。

您似乎对NSTimer是什么感到困惑。它不像秒表那样是"计时器"。它提供了一种以特定间隔异步执行方法的方法(例如"每1秒调用一次此方法")。

虽然以下内容有点言过其实,但它使用MVC来说明这一点。代码示例取自"Swift教学应用程序开发"秒表项目。

型号秒表.swift

import Foundation
class Stopwatch {
    private var startTime: NSDate?
    var elapsedTime: NSTimeInterval {
        if let startTime = self.startTime {
            return -startTime.timeIntervalSinceNow
        } else {
            return 0
        }
    }
    var elapsedTimeAsString: String {
        return String(format: "%02d:%02d.%d",
            Int(elapsedTime / 60),
            Int(elapsedTime % 60),
            Int(elapsedTime * 10 % 10))
    }
    var isRunning: Bool {
        return startTime != nil
    }
    func start() {
        startTime = NSDate()
    }
    func stop() {
        startTime = nil
    }
}

控制器ViewController.swift:

import UIKit
class ViewController: UIViewController {
    @IBOutlet weak var elapsedTimeLabel: UILabel!
    let stopwatch = Stopwatch()
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    @IBAction func startStopwatch(sender: UIButton) {
        NSTimer.scheduledTimerWithTimeInterval(0.1, target: self,
            selector: "updateElapsedTimeLabel:", userInfo: nil,
            repeats: true)
        stopwatch.start()
    }
    @IBAction func stopStopwatch(sender: UIButton) {
        stopwatch.stop()
    }
    func updateElapsedTimeLabel(timer: NSTimer) {
        if stopwatch.isRunning {
            elapsedTimeLabel.text = stopwatch.elapsedTimeAsString
        } else {
            timer.invalidate()
        }
    }
}

换句话说,您需要使用NSDate对象而不是Int对象进行"时间计算"。

要获得您在问题中提到的功能#1,您可以更改updateElapsedTimeLabel:中的逻辑,以便在"四分钟后"stopwatch.elapsedTimeNSDate之间的差值为0时调用函数。

要获得倒计时的功能#2,只需添加一个方法timeLeft,该方法返回"四分钟后"的NSDate与逝去的时间之间的差值。

这里的重点是了解NSTimer是如何工作的,如何使用NSDate来计算两个时刻之间的差,以及如何使用格式字符串来显示您想要的内容。这里有足够的原材料供您执行自己的要求。

最新更新