iOS 如何创建倒计时器 [小时,分钟,秒] Swift 4

2023-12-12

我想要创建倒计时时间,但我找不到此类信息如何做到这一点。

例如我有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


退一步思考一下这个问题。定期更新 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它是否可以合理配置并利用设备本地化设置来生成其输出

您还可以看看在 Swift 中按定义的时间停止计时器它提供了相同概念的可运行示例,但也支持暂停/恢复功能

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 如何创建倒计时器 [小时,分钟,秒] Swift 4 的相关文章

随机推荐

  • 为什么Java 6重写SortedMap中的keySet()、entrySet()和values()接口

    Java 5 http docs oracle com javase 1 5 0 docs api java util SortedMap html Java 6 https docs oracle com javase 6 docs ap
  • iOS 如何检测用户是否使用 home+power 进行了截图?

    我正在尝试检测用户是否截取屏幕截图 以警告他们这是一个受版权保护的视频 我尝试过达尔文通知 但它不起作用 NSMetadataQuery 可能是一个解决方案 但我们希望该应用程序也能在 iOS4 上运行 有人可以帮助我吗 谢谢 p 无法检测
  • SignalR 连接无法启动到 IIS 托管的应用程序

    我制作了一个应用程序 并尝试通过 SignalR 连接到后端 ASP NET Core 3 1 后端托管在 IIS 中 以便于开发 在客户端上调用 StartAsync 方法成功协商 但随后在 GET 上永远挂起 GET http loca
  • 使用 Jackson 忽略字段而不修改 POJO 类

    我的 POJO 类有 JsonIgnore在字段的声明上 而不是在 getter 和 setter 方法上 这是一个生成的文件 我无法对其进行太多更改 如何在使用时忽略该字段JsonGenerator Setting Using JsonI
  • 所有 tkinter 函数在程序启动时运行

    我在使用 tkinter 时遇到了一个以前从未遇到过的非常奇怪的问题 在任何地方为小部件 例如按钮或菜单项 设置命令时 该命令都会在应用程序启动时运行 基本上 该命令不会等到单击小部件才运行 在我的代码中 我知道我没有打包按钮 这是为了表明
  • 有没有更好的方法来迭代行(30000)的嵌套循环?

    我想在下表中找到包含重复电子邮件地址的行 当电子邮件地址重复时 我在以下代码的数据框中创建一个额外的列 其值为 ja 这对于少量行 150 来说很好 对于大量行 30000 脚本会挂起 有更好的方法来循环行吗 import pandas a
  • Scrapy:是否可以暂停Scrapy并在x分钟后恢复?

    我正在尝试抓取一个大型网站 他们有一个速率限制系统 scrapy是否可以在遇到403页面时暂停10分钟 我知道我可以设置一个 DOWNLOAD DELAY 但我注意到我可以通过设置一个小的 DOWNLOAD DELAY 来更快地抓取 然后在
  • Swift,从字符串中获取变量名称

    我有个问题 我知道这可以在 Ruby 中完成 不确定 Swift 是否可以 但从未做过类似的事情 我正在开发的程序的工作原理与此类似 如果用户在 TextView 中写入 a b 我的代码应该详细说明变量 a 和 b 之间的总和值 我的意思
  • 如何在postgres中根据IF条件删除表?

    我试图根据条件在启动时删除表 IF NOT EXISTS select from pg class where relname mytable and relpersistence u DROP TABLE IF EXISTS mytabl
  • 什么时候使用嵌套 Java 类真正有用?

    你能给我一个嵌套java类有用的具体例子吗 我正在研究它 我了解它是如何工作的 但我无法想象真正需要使用它的真实情况 太感谢了 Marco 关于何时使用嵌套类的最简洁的总结是 当该类在逻辑上是外部类 API 的一部分时 或者当它封装特定于外
  • 如何选择 ID 中包含特殊字符的元素?

    我有一个带有网格的页面 其中包含很多如果使用 奇怪的名称 输入来模拟数组
  • 如何知道 Flutter 中的 Nested Widget 内部发生了 pop 事件

    我目前正在构建应用程序 我需要使用嵌套路由来保持一个屏幕相同并在不同的屏幕上进行路由 我想当第二条路线弹出时 以便我可以更改扩展的值以填充整个屏幕 Github 中的要点 这是代码示例 import package flutter mate
  • R:如何从数据框中提取列表?

    考虑这个简单的例子 gt weird df lt data frame col1 c hello world again col weird list list 12 23 list 23 24 NA gt gt weird df A ti
  • 污染玫瑰图网格

    我正在尝试创建一个污染玫瑰图 如链接中所述绘制 Windrose 制作浓度设置为颜色的污染玫瑰 回复中的示例有效 但是当我使用我的数据时 它给出了一个奇怪的图 有什么建议我哪里出错了吗 谢谢 import matplotlib pyplot
  • 使用带有子域的邮递员时出现“无法得到任何响应”响应

    我正在使用邮递员来测试我拥有的 API 当请求不包含子域时一切都很好 但是当我向 URL 添加子域时我收到此响应 无法得到任何回应 连接时出错http 子域名 localhost 端口 api 为什么会发生这种情况 服务器无法发送响应 确保
  • Sql 查询中的新行

    如何在 Sql 查询中获取新行或换行符 Pinal Dave 在他的博客中对此做了很好的解释 http blog sqlauthority com 2009 07 01 sql server difference Between line
  • 删除 Bootstrap 4 行列中的等高

    我目前正在尝试新版本引导程序 当使用更新的网格系统使用此代码分割两列时 JSFiddle div class row div class col lg 4 col md 4 col sm 4 hidden xs down Some cont
  • 如何解决 pmd 违规“NullAssignment”?

    PMD报告NullAssignment以下代码 修复它的最佳实践是什么 将对象分配给 null 是一种代码味道 考虑重构 下面的代码不是我写的 我也有一个疑问为什么要创建一个临时定时器实例 然后将这个实例分配给定时器 startTimer
  • Java找不到main方法

    我在一个简单的 hello world 程序上遇到了麻烦 哈哈 我希望有人能对此有所启发 所以接收错误如下 javac Hello java java Hello Exception in thread main java lang NoS
  • iOS 如何创建倒计时器 [小时,分钟,秒] Swift 4

    我想要创建倒计时时间 但我找不到此类信息如何做到这一点 例如我有200分钟了3 3小时 为了这3 3小时我想要制作倒计时器 我可以在标签上看到这些信息吗 我怎样才能做到这一点 我在论坛上找到了这样的代码 func startTimer le