gpt4 book ai didi

swift - 设置对象创建后的计时器倒计时

转载 作者:搜寻专家 更新时间:2023-10-31 22:48:20 25 4
gpt4 key购买 nike

我正在从 Parse 中的几个对象查询 createdAt 日期。我想创建一个 24 小时(或 48/72 等)倒计时计时器,从创建对象时开始倒计时到 24 小时后。 (然后我也会对其进行格式化,并将其显示在单元格 UILabel 上。)

示例:如果一个对象是在 19:34:33 创建的,我希望它在 24 小时后过期(或者我在创建后指定的小时数)。最终在 UILabel 上显示对象过期前的剩余时间。

目前,我正在检索它的创建时间,使其从创建时间开始重复倒计时。

但是,我想制定逻辑,以便在创建对象时进行处理,然后显示在 24 小时或 48 小时、72 小时等结束之前还剩下多少小时。

编辑

感谢@pulsar,我在下面的描述中添加了几行代码。现在的问题是我只能检索并正确倒计时 1 个对象的 createdAt 日期和时间,因为第一个对象被查询,使得所有其他对象都具有在它们各自的 indexPath.row 中与 Parse 中的第一个对象相同的过期倒计时计时器。

我不知道如何添加所有对象,以便它们都有各自的 countDown 过期时间,这些过期时间由 expiresAt 函数触发。

下面是我如何查询和格式化它(在 viewDidLoad 中):这是我问的帮助我格式化日期的问题:Swift countDown timer Logic

请看代码中的注释!

            var createdAt = object.createdAt
if createdAt != nil {


//assuming this is where i have to set expiration logic?

let calendar = NSCalendar.currentCalendar()
let comps = calendar.components([.Hour, .Minute, .Second], fromDate: createdAt as NSDate!)
let hours = comps.hour * 3600
let minutes = comps.minute * 60
let seconds = comps.second

//I'm adding these two lines below but not sure what to do with them considering I need to add all the objects to an array that will then display it on indexPath.row(s)

let twentyFourHours = NSTimeInterval(60 * 60 * 24)
self.expiresAt = NSDate(timeInterval: twentyFourHours, sinceDate: object.createdAt!!)


self.timerInt.append(hours + minutes + seconds)
//What do i append to the timerInt array? How can i append the objects while triggering the the expiresAt function?

}

这是我的倒计时函数:

               func countDown() {

//timerInt is an array where I'm storing the Int values.
for i in 0 ..< timerInt.count {

let hours = timerInt[i] / 3600
//have to somehow add the expiresAt method while looping through each value [i]...?
let minsec = timerInt[i] % 3600
let minutes = minsec / 60
let seconds = minsec % 60
print(String(format: "%02d:%02d:%02d", hours, minutes, seconds))
timerInt[i]--

//Im assuming best practice would be to loop through the values in order to change the values/set the expiration time to each object (the expiresAt method). Any ideas of how and where I can add this in this loop so that it reflects the countDown I want to set?

}

self.tableView.reloadData()

}

最后,对于我的 indexPath.row,我正在格式化它并像这样显示它:

          override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let myCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! cell

//I'm formatting the hours, minutes, seconds. However I'm missing the expiresAt function and I have no clue as to where and how to include it... Should it be here or in the countDown() loop?

let hours = timerInt[indexPath.row] / 3600
let minsec = timerInt[indexPath.row] % 3600
let minutes = minsec / 60
let seconds = minsec % 60


myCell.secondLabel.text = String(format: "%02d:%02d:%02d", hours, minutes, seconds)


return myCell
}

关于如何将其设置为自创建后 24/48/72 小时倒计时的想法?

非常感谢任何帮助!

最佳答案

听起来你需要的是设置到期日期,然后获取当前日期和到期日期之间的日期组件。然后您可以使用 NSTimer 来刷新显示。 (完成后不要忘记调用 NSTimer.invalidate())。

一个例子:

class YourViewController: UIViewController {

var expiresAt: NSDate?

func viewDidLoad() {
// your parse logic here
let twentyFourHours = NSTimeInterval(60 * 60 * 24)
expiresAt = NSDate(timeInterval: twentyFourHours, sinceDate: createdAt)
scheduleTimer()
}

func scheduleTimer() {
NSTimer.scheduledTimerWithTimeInterval(1.0 / 30.0, target: self, selector: "tick:", userInfo: nil, repeats: true)
}

@objc
func tick(timer: NSTimer) {
guard let expiresAt = expiresAt else {
return
}
let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
if let components = calendar?.components([.Hour, .Minute, .Second], fromDate: NSDate(), toDate: expiresAt, options: []) {
print(formatDateComponents(components))
}
}

func formatDateComponents(components: NSDateComponents) -> String {
let hours = components.hour
let minutes = components.minute
let seconds = components.second
return "\(hours):\(minutes):\(seconds)"
}

}

您还可以通过使用结构来存储日期组件而不是对 timerInt 字符串进行复杂的解析,从而使您的生活变得更加轻松。

struct Time {
let hours: String
let minutes: String
let seconds: String
}

关于swift - 设置对象创建后的计时器倒计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33417248/

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