我的计时器在倒计时,但我遇到了问题:
- 使计时器在达到0时连续重新启动
- 倒计时是这样的: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.elapsedTime
和NSDate
之间的差值为0时调用函数。
要获得倒计时的功能#2,只需添加一个方法timeLeft
,该方法返回"四分钟后"的NSDate
与逝去的时间之间的差值。
这里的重点是了解NSTimer
是如何工作的,如何使用NSDate
来计算两个时刻之间的差,以及如何使用格式字符串来显示您想要的内容。这里有足够的原材料供您执行自己的要求。