快速倒计时计时器逻辑
Posted
技术标签:
【中文标题】快速倒计时计时器逻辑【英文标题】:Swift countDown timer Logic 【发布时间】:2016-01-28 09:26:05 【问题描述】:我正在按天、小时和秒创建倒数计时器。我目前将它们存储在 String 数组中,同时还将它们转换为 Int (使用 map()
),以便在将值转换为标签时可以倒计时/递减。
打印到日志时的当前输出为:["[68168]", "[68188]", "[68243]", "[68281]"]
我在形成 countDown 函数的逻辑时遇到问题,以便当秒数达到“0”时,1 分钟下降,59 分钟后减少 1 小时,等等,直到它达到“00:00:00 ”。
在每个索引中,我有 [Hour, Minute, Second] 的 3 个值。但我有几个索引。
目前我正在使用小时 * 3600,分钟 * 60 + 秒。我的问题是如何将其划分并在 countDown 函数中分解...
这是我的代码:
//Here I'm querying and converting the objects into Hour, Minute, Seconds.
var createdAt = object.createdAt
if createdAt != nil
let calendar = NSCalendar.currentCalendar()
let comps = calendar.components([.Hour, .Minute, .Second], fromDate: createdAt as NSDate!)
let hour = comps.hour * 3600
let minute = comps.minute * 60
let seconds = comps.second
let intArray = [hour, minute, seconds]
//Now i'm appending to the String array below.
self.timeCreatedString.append("\(intArray)")
var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("countDown"), userInfo: nil, repeats: true)
func countDown()
//completely stuck as to how to decrement/divide up the values so that I can display it as: 23:49:01 (Hours, minutes, seconds).
如何形成它以便每个索引中的每个元素分别倒计时?例如:“23:59:59”
PS,这是在 TableViewController 上构建的。我想在 cellForRowAtIndexPath
方法中将其打印到 cell View Controller 中的标签 p>
【问题讨论】:
【参考方案1】:将倒计时时间保存在一个名为 countdown
的变量中:
var countdown = 7202 // two hours and two seconds
需要显示时,将其拆分为hours
、minutes
和seconds
,并使用String(format:)
构造函数对其进行格式化:
// loop 5 times to demo output
for _ in 1...5
let hours = countdown / 3600
let minsec = countdown % 3600
let minutes = minsec / 60
let seconds = minsec % 60
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))
countdown--
输出:
02:00:02 02:00:01 02:00:00 01:59:59 01:59:58如果您有多个计时器,请将它们放在一个数组中:
// Array holding 5 different countdown timers referred to as
// timers[0], timers[1], timers[2], timers[3] and timers[4]
var timers = [59, 61, 1000, 3661, 12345]
for i in 0 ..< times.count
let hours = timers[i] / 3600
let minsec = timers[i] % 3600
let minutes = minsec / 60
let seconds = minsec % 60
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))
输出:
00:00:59 00:01:01 00:16:40 01:01:01 03:25:45【讨论】:
如果我必须查询 x 个不同时间的不同日期怎么办?如何将它们全部存储在变量中?不应该通过数组来完成吗? 当然,您可以将countdown
设为一组时间var countdown = [Int]()
,然后按索引引用每个时间,例如countdown[0]
、countdown[1]
等。只需替换countdown
在上面的逻辑中,countdown[n]
n
是您当前正在格式化的计时器的索引。如果您有固定数量的计时器,例如 5 个,您可以使用var countdown = [0,0,0,0,0]
。如果你想为n
定时器分配空间,那么var countdown = [Int](count: n, repeatedValue: 0)
。
感谢您的回复顺便说一句...这将如何与我拥有的 intArray/timeCreatedString 数组一起使用?我将如何像你在上面的答案中那样用变量来划分我要附加的数组?当我只有一个变量时,代码可以工作,但我很困惑如何做同样的事情,但只是为了数组中的索引值......
查看更新的答案。每个数组元素以秒为单位保存 1 个计时器的当前值。该值在显示时分为小时、分钟和秒。
嘿一个问题:当我打印到日志中的数组值时,我得到了没有格式的完整数字。如何在不使用print(format())
方法的情况下对其进行格式化?最终,我在将其放在 UI 上时遇到了问题。我只得到时间的第一个原始数值:6871
,它没有移动。这发生在 cellForRowAtIndexPath 中,如下所示:myCell.secondLabel.text = ("\(timerInt[indexPath.row])")
任何想法如何在这里格式化/触发计时器?以上是关于快速倒计时计时器逻辑的主要内容,如果未能解决你的问题,请参考以下文章