在 Swift 中恢复 NSTimer

Resuming an NSTimer in Swift

我在这方面看到的其他问题没有帮助。我希望能够启动、暂停然后恢复 NSTimer。我知道如何启动 NSTimer。我也知道你不能 'pause' NSTimer 但你可以使它无效。但是,如果我想在我停止计时器时保持相同的时间恢复它,我将不得不做什么?这是代码:

var startTimer = NSTimeInterval()
var timer = NSTimer()
@IBOutlet var displaylabel: UILabel! 
@IBAction func start(sender: UIButton) {
        timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "updateTime", userInfo: nil, repeats: true)
        startTimer = NSDate.timeIntervalSinceReferenceDate()
}
@IBAction func stop(sender: UIButton) {
timer.invalidate()
}
@IBAction func resume(sender: UIButton) {
// Code needed
}
func updateTime() {
    let currentTime = NSDate.timeIntervalSinceReferenceDate()
    var elapsedTime: NSTimeInterval = currentTime - startTimer
    let minutes = UInt8(elapsedTime / 60.0)
    elapsedTime -= (NSTimeInterval(minutes) * 60)
    let seconds = UInt8(elapsedTime)
    elapsedTime -= NSTimeInterval(seconds)
    let fraction = UInt8(elapsedTime * 100)
    let strMinutes = String(format: "%02d", minutes)
    let strSeconds = String(format: "%02d", seconds)
    let strFraction = String(format: "%02d", fraction)
    displaylabel.text = "\(strMinutes):\(strSeconds).\(strFraction)"
}

提前致谢。安东

您应该使用 CADisplayLink 有两个原因:

  1. 您将尽可能频繁地更新屏幕,而不是浪费额外的电池寿命来尝试更频繁地更新它。所有 iOS 设备(iPad Pro 在极少数情况下除外)每秒最多更新屏幕 60 次。将您的计时器安排为 0.01 秒意味着您尝试每秒至少更新屏幕 40 次,这比必要的频率要高。

  2. 您可以暂停和恢复 CADisplayLink

处理暂停需要一点思考。你想要做的是记录你暂停的时间(与开始时间分开),然后当你恢复时,将开始时间增加自暂停以来经过的时间。

class ViewController: UIViewController {

    private var startTime = NSTimeInterval(0)
    private var pauseTime = NSTimeInterval(0)
    private var displayLink: CADisplayLink!

    @IBOutlet var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        displayLink = CADisplayLink(target: self, selector: "displayLinkDidFire")
        displayLink.paused = true
        displayLink.addToRunLoop(NSRunLoop.mainRunLoop(), forMode: NSRunLoopCommonModes)
    }

    @IBAction func startWasTapped(sender: AnyObject) {
        startTime = NSDate.timeIntervalSinceReferenceDate()
        displayLink.paused = false
    }

    @IBAction func resumeWasTapped(sender: AnyObject) {
        startTime += NSDate.timeIntervalSinceReferenceDate() - pauseTime
        displayLink.paused = false
    }

    @IBAction func stopWasTapped(sender: AnyObject) {
        pauseTime = NSDate.timeIntervalSinceReferenceDate()
        displayLink.paused = true
    }

    func displayLinkDidFire() {
        let elapsedTime = NSDate.timeIntervalSinceReferenceDate() - startTime
        label.text = String(format: "%02.0f:%05.2f", floor(elapsedTime / 60), elapsedTime)
    }

}