在SWIFT中制作合法倒数计时器

时间:2015-11-03 06:12:14

标签: ios xcode swift

按下按钮时,我试图让标签倒计时,以(小时,分钟,秒)方式显示倒计时。我试图连接我发现的两个不同的代码。这就是我所拥有的:

*updated code (some psuedo code)*

var timer = NSTimer()

func timerResults() {
    let theDate = NSDate()
    var endTime = theDate //+ 6 hours
    let timeLeft = endTime - theDate
    timeLeftLabel.text = "\(timeLeft)"
}


@IBOutlet weak var timeLeftLabel: UILabel!

@IBAction func IBbtnUpdateTap(sender: UIButton){

        timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("timerResults"), userInfo: nil, repeats: true)

    }

另外,即使应用程序未运行,如何才能主动进行此倒计时?基本上,如果用户在6小时内回来,我就会创建一个奖励系统。

2 个答案:

答案 0 :(得分:3)

我现在不能给出一个很长的答案,但最简单的方法如下:

当用户以一定的秒数启动计时器时,计算计时器应该结束的确切日期(end time = now + amount of seconds)。现在,您可以使用计算的剩余时间(time left = end time - now)更新每次显示刷新的标签。

通过这种方式可以确保将时间保留在应用程序重新启动上(当然您需要使用NSUserDefaults或其他内容保存结束日期)并且还可以保证计时器速度没有波动(NSTimer不会'保证)

答案 1 :(得分:2)

您遗失或需要更正的项目如下:

var startTime: NSDate = NSDate()
var endTime: NSDate?

func viewDidLoad() {
    let clock = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "countdown", userInfo: nil, repeats: true)
    endTime = startTime.dateByAddingTimeInterval(21600)
}

func countdown() {
    printSecondsToHoursMinutesSeconds(Int(timeLeft()))
}

func timeLeft() -> Double {
    return endTime!.timeIntervalSinceNow
}

要衡量应用未运行的时间,需要节省应用进入后台的时间,然后比较再次打开应用时节省的时间。时间可以保存为NSDate。两个NSDates之间的比较可以为您提供NSTimeInterval,即两个日期之间经过的秒数。例如:

let remainingTime = savedTime.timeIntervalSinceNow

请在您的应用代理中查看applicationDidBecomeActive:applicationDidEnterBackground:,以便比较并将日期保存到NSUserDefaults。