快速倒计时计时器逻辑

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

需要显示时,将其拆分为hoursminutesseconds,并使用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])") 任何想法如何在这里格式化/触发计时器?

以上是关于快速倒计时计时器逻辑的主要内容,如果未能解决你的问题,请参考以下文章

iOS快速实现一个保存记录的倒计时按钮

后台快速计时器

微信小程序长时间计时方法

快速无效计时器不起作用

日期选择器中的小时:分钟:秒如何快速

如果条件为真,则使用类中的布尔逻辑来设置计时器