【问题标题】:iOS How to create countdown time [hours,minutes,seccond] Swift 4iOS如何创建倒计时时间[小时,分钟,秒] Swift 4
【发布时间】:2018-09-07 05:34:18
【问题描述】:

我想创建倒计时,但我找不到这样的信息我该怎么做。

例如我有 200 分钟是 3,3 小时

对于这 3,3 小时,我想要倒计时,我可以在标签上看到这些信息吗?

我该怎么做?

我在论坛找到这样的代码:

func startTimer() {

    let releaseDateString = "03:33:00"
    let releaseDateFormatter = DateFormatter()
    releaseDateFormatter.dateFormat = "HH:mm:ss"
    releaseDate = releaseDateFormatter.date(from: releaseDateString)! as NSDate

    countdownTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}

@objc func updateTime() {

    let currentDate = Date()
    let calendar = Calendar.current

    let diffDateComponents = calendar.dateComponents([.hour, .minute, .second], from: currentDate, to: releaseDate! as Date)

    let countdown = "Hours \(diffDateComponents.hour ?? 0), Minutes \(diffDateComponents.minute ?? 0), Seconds \(diffDateComponents.second ?? 0)"
    label.text = "\(countdown)"

    print(countdown)
}

但我得到了这样的结果:

小时 -163779,分钟 -48,秒 -34

【问题讨论】:

  • @MadProgrammer 不,我找不到这样的信息
  • 打印releaseDate,你的问题就很明显了。
  • 真的,因为我在重复链接中有一个完整的可运行示例链接(对不起,键盘正在播放)
  • @rmaddy 对不起,我得到了这个 Optional(2000-01-01 01:33:00 +0000)

标签: ios swift timer


【解决方案1】:

退后一步,想想这个问题。定期更新 UI 实际上非常简单,但它也不可靠(它只保证“至少”精度),因此您不能依赖它来准确更新计数器或基于时间的值(即,您不应该使用它在每个刻度上增加一个“第二个”值)。

你想要的是一个“锚定”时间,你可以从中计算出总运行时间,然后计算剩余时间。

Swift/Apple 提供了许多简洁的 API,您可以使用它们来完成所有这些事情。

这只是我在操场上拼凑的东西......

import UIKit

// Anchor time
let startTime: Date = Date()
// The total amount of time to wait
let duration: TimeInterval = 200 * 60 // 200 minutes

let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
formatter.zeroFormattingBehavior = .dropLeading
formatter.unitsStyle = .short
// The amount of time which has past since we started
var runningTime: TimeInterval = 0

// This is just so I can atrificially update the time
var time: Date = Date()
let cal: Calendar = Calendar.current
repeat {
    // Simulate the passing of time, by the minute
    // If this was been called from a timer, then you'd
    // simply use the current time
    time = cal.date(byAdding: .minute, value: 1, to: time)!

    // How long have we been running for?
    runningTime = time.timeIntervalSince(startTime)
    // Have we run out of time?
    if runningTime < duration {
        // Print the amount of time remaining
        print(formatter.string(from: duration - runningTime)!)
    }
} while runningTime < duration

这将打印出来...

3 hr, 18 min, 59 sec
3 hr, 17 min, 59 sec
3 hr, 16 min, 59 sec
3 hr, 15 min, 59 sec
3 hr, 14 min, 59 sec
3 hr, 13 min, 59 sec
3 hr, 12 min, 59 sec
3 hr, 11 min, 59 sec
3 hr, 10 min, 59 sec
3 hr, 9 min, 59 sec
3 hr, 8 min, 59 sec
3 hr, 7 min, 59 sec
3 hr, 6 min, 59 sec
3 hr, 5 min, 59 sec
3 hr, 4 min, 59 sec
3 hr, 3 min, 59 sec
3 hr, 2 min, 59 sec
3 hr, 1 min, 59 sec
3 hr, 0 min, 59 sec
2 hr, 59 min, 59 sec
2 hr, 58 min, 59 sec
2 hr, 57 min, 59 sec
2 hr, 56 min, 59 sec
2 hr, 55 min, 59 sec
2 hr, 54 min, 59 sec
2 hr, 53 min, 59 sec
2 hr, 52 min, 59 sec
2 hr, 51 min, 59 sec
2 hr, 50 min, 59 sec
2 hr, 49 min, 59 sec
2 hr, 48 min, 59 sec
2 hr, 47 min, 59 sec
2 hr, 46 min, 59 sec
2 hr, 45 min, 59 sec
2 hr, 44 min, 59 sec
2 hr, 43 min, 59 sec
2 hr, 42 min, 59 sec
2 hr, 41 min, 59 sec
2 hr, 40 min, 59 sec
2 hr, 39 min, 59 sec
2 hr, 38 min, 59 sec
2 hr, 37 min, 59 sec
2 hr, 36 min, 59 sec
2 hr, 35 min, 59 sec
2 hr, 34 min, 59 sec
2 hr, 33 min, 59 sec
2 hr, 32 min, 59 sec
2 hr, 31 min, 59 sec
2 hr, 30 min, 59 sec
2 hr, 29 min, 59 sec
2 hr, 28 min, 59 sec
2 hr, 27 min, 59 sec
2 hr, 26 min, 59 sec
2 hr, 25 min, 59 sec
2 hr, 24 min, 59 sec
2 hr, 23 min, 59 sec
2 hr, 22 min, 59 sec
2 hr, 21 min, 59 sec
2 hr, 20 min, 59 sec
2 hr, 19 min, 59 sec
2 hr, 18 min, 59 sec
2 hr, 17 min, 59 sec
2 hr, 16 min, 59 sec
2 hr, 15 min, 59 sec
2 hr, 14 min, 59 sec
2 hr, 13 min, 59 sec
2 hr, 12 min, 59 sec
2 hr, 11 min, 59 sec
2 hr, 10 min, 59 sec
2 hr, 9 min, 59 sec
2 hr, 8 min, 59 sec
2 hr, 7 min, 59 sec
2 hr, 6 min, 59 sec
2 hr, 5 min, 59 sec
2 hr, 4 min, 59 sec
2 hr, 3 min, 59 sec
2 hr, 2 min, 59 sec
2 hr, 1 min, 59 sec
2 hr, 0 min, 59 sec
1 hr, 59 min, 59 sec
1 hr, 58 min, 59 sec
1 hr, 57 min, 59 sec
1 hr, 56 min, 59 sec
1 hr, 55 min, 59 sec
1 hr, 54 min, 59 sec
1 hr, 53 min, 59 sec
1 hr, 52 min, 59 sec
1 hr, 51 min, 59 sec
1 hr, 50 min, 59 sec
1 hr, 49 min, 59 sec
1 hr, 48 min, 59 sec
1 hr, 47 min, 59 sec
1 hr, 46 min, 59 sec
1 hr, 45 min, 59 sec
1 hr, 44 min, 59 sec
1 hr, 43 min, 59 sec
1 hr, 42 min, 59 sec
1 hr, 41 min, 59 sec
1 hr, 40 min, 59 sec
1 hr, 39 min, 59 sec
1 hr, 38 min, 59 sec
1 hr, 37 min, 59 sec
1 hr, 36 min, 59 sec
1 hr, 35 min, 59 sec
1 hr, 34 min, 59 sec
1 hr, 33 min, 59 sec
1 hr, 32 min, 59 sec
1 hr, 31 min, 59 sec
1 hr, 30 min, 59 sec
1 hr, 29 min, 59 sec
1 hr, 28 min, 59 sec
1 hr, 27 min, 59 sec
1 hr, 26 min, 59 sec
1 hr, 25 min, 59 sec
1 hr, 24 min, 59 sec
1 hr, 23 min, 59 sec
1 hr, 22 min, 59 sec
1 hr, 21 min, 59 sec
1 hr, 20 min, 59 sec
1 hr, 19 min, 59 sec
1 hr, 18 min, 59 sec
1 hr, 17 min, 59 sec
1 hr, 16 min, 59 sec
1 hr, 15 min, 59 sec
1 hr, 14 min, 59 sec
1 hr, 13 min, 59 sec
1 hr, 12 min, 59 sec
1 hr, 11 min, 59 sec
1 hr, 10 min, 59 sec
1 hr, 9 min, 59 sec
1 hr, 8 min, 59 sec
1 hr, 7 min, 59 sec
1 hr, 6 min, 59 sec
1 hr, 5 min, 59 sec
1 hr, 4 min, 59 sec
1 hr, 3 min, 59 sec
1 hr, 2 min, 59 sec
1 hr, 1 min, 59 sec
1 hr, 0 min, 59 sec
59 min, 59 sec
58 min, 59 sec
57 min, 59 sec
56 min, 59 sec
55 min, 59 sec
54 min, 59 sec
53 min, 59 sec
52 min, 59 sec
51 min, 59 sec
50 min, 59 sec
49 min, 59 sec
48 min, 59 sec
47 min, 59 sec
46 min, 59 sec
45 min, 59 sec
44 min, 59 sec
43 min, 59 sec
42 min, 59 sec
41 min, 59 sec
40 min, 59 sec
39 min, 59 sec
38 min, 59 sec
37 min, 59 sec
36 min, 59 sec
35 min, 59 sec
34 min, 59 sec
33 min, 59 sec
32 min, 59 sec
31 min, 59 sec
30 min, 59 sec
29 min, 59 sec
28 min, 59 sec
27 min, 59 sec
26 min, 59 sec
25 min, 59 sec
24 min, 59 sec
23 min, 59 sec
22 min, 59 sec
21 min, 59 sec
20 min, 59 sec
19 min, 59 sec
18 min, 59 sec
17 min, 59 sec
16 min, 59 sec
15 min, 59 sec
14 min, 59 sec
13 min, 59 sec
12 min, 59 sec
11 min, 59 sec
10 min, 59 sec
9 min, 59 sec
8 min, 59 sec
7 min, 59 sec
6 min, 59 sec
5 min, 59 sec
4 min, 59 sec
3 min, 59 sec
2 min, 59 sec
1 min, 59 sec
59 sec

DateComponentsFormatter 的好处在于它可以合理配置,并利用设备本地化设置来生成其输出

您还可以查看Stopping timer at defined amount of time in Swift,它提供了相同概念的可运行示例,但也支持暂停/恢复功能

【讨论】:

    【解决方案2】:

    使用此功能显示时:分:秒

    func timeString(time: TimeInterval) -> String {
        let hours = Int(time) / 3600
        let minutes = Int(time) / 60 % 60
        let seconds = Int(time) % 60
        return String(format:"%02i:%02i:%02i", hours, minutes, seconds)
    }
    
    timerLabel.text = timeString(time: TimeInterval(DurationInSeconds))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 2021-09-17
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多