使用NSTimer仅秒数(从00:20到0)

我需要从20秒到0秒的标签倒计时,重新开始。 这是我第一次在Swift中做一个项目,我正在尝试使用NSTimer.scheduledTimerWithTimeInterval 。 这个倒计时应该循环运行一定的时间。

我很难实现一个启动重新启动方法(循环)。 我基本上没有find一个方法来开始20多岁的时钟,当它结束时,再次启动。

对于如何做瓦格纳的任何想法,我将不胜感激

  @IBAction func startWorkout(sender: AnyObject) { timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("countDownTime"), userInfo: nil, repeats: true) startTime = NSDate.timeIntervalSinceReferenceDate() } func countDownTime() { var currentTime = NSDate.timeIntervalSinceReferenceDate() //Find the difference between current time and start time. var elapsedTime: NSTimeInterval = currentTime - startTime //calculate the seconds in elapsed time. let seconds = UInt8(elapsedTime) elapsedTime -= NSTimeInterval(seconds) //find out the fraction of milliseconds to be displayed. let fraction = UInt8(elapsedTime * 100) //add the leading zero for minutes, seconds and millseconds and store them as string constants let strSeconds = seconds > 9 ? String(seconds):"0" + String(seconds) let strFraction = fraction > 9 ? String(fraction):"0" + String(fraction) //concatenate minuets, seconds and milliseconds as assign it to the UILabel timeLabel.text = "\(strSeconds):\(strFraction)" } 

你应该从现在开始设置你的date结束时间20秒,只是检查datetimeIntervalSinceNow。 一旦timeInterval达到0,你再次设置20秒

 import UIKit class ViewController: UIViewController { @IBOutlet weak var strTimer: UILabel! var endTime = NSDate().dateByAddingTimeInterval(20) var timer = NSTimer() func updateTimer() { let remaining = endTime.timeIntervalSinceNow strTimer.text = remaining.time if remaining <= 0 { endTime = NSDate().dateByAddingTimeInterval(20) } } override func viewDidLoad() { super.viewDidLoad() strTimer.text = "20:00" timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "updateTimer", userInfo: nil, repeats: true) NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } extension NSTimeInterval { var time:String { return String(format:"%02d:%02d", Int((self) % 60 ),Int(self*100 % 100 ) ) } } 

在countdownTime()中,当您的运行时间达到20秒时,将startTime更改为当前时间

首先,如果你只是循环而不停止,你可以使用模块来获得秒。 那就是seconds % 20就会从19.9跳到0.0。 因此,如果你倒计时,你会计算seconds - seconds % 20 ,当它达到零时会跳到20。 一遍又一遍地。 这是你在追求什么?

对于前导零可以使用: String(format: "%02d:%02d", seconds, fraction) 。 请注意格式:这里秒和小数是整数。

但是,如果您需要停止定时器,则必须跟踪以前计算的秒数,并在每次启动时重置startTime 。 每次你停下来,你都必须把当前的秒数加到先前计算的秒数上。 我有什么意义吗?

为了最小化处理,你可以创build两个定时器。 一个定时器20秒,另一个定时器你想要更新UI的频率。 这将是很难看到每秒100帧。 如果你正在检查每0.01,你的代码是不太准确的。 该手册真的很有帮助。 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/当你不再使用定时器invalidate并设置为nil&#x3002; 其他定时function也存在。