gpt4 book ai didi

swift - 如何使用 NSTimer 更新以分钟和秒为单位的耗时的标签?

转载 作者:行者123 更新时间:2023-11-28 08:38:14 25 4
gpt4 key购买 nike

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

  1. 让计时器在达到 0 后继续重新开始
  2. 倒计时是这样的:4:00、3:59、3:58...而不是 240、239、238...

这是我的代码:

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 来说明这一点。代码示例取自 "Teaching App Development with Swift" Stopwatch project .

模型Stopwatch.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
}

}

Controller 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“从现在开始四分钟”与 elapsedTime 之间的差值。

这里的重点是理解NSTimer是如何工作的,如何使用NSDate来计算两个时刻的时间差,以及如何使用格式字符串来显示什么你要。这里有足够的原 Material 供您实现自己的要求。

关于swift - 如何使用 NSTimer 更新以分钟和秒为单位的耗时的标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37104123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com