使用毫秒创建倒数计时器(NSTimer)但不能正确倒计时

时间:2016-02-19 19:06:33

标签: ios swift nstimer countdown

我对Xcode(swift)很陌生,简而言之,我正在努力制作一个倒数计时器,它以秒和小数计数。

它应该倒数,但是,例如,当我从13秒倒计时时,我手动计时它真的需要23秒。 这可能是一个简单的解决方案,但我已经尝试了很多东西,无法弄清楚如何解决它。

这是我的代码:

 import UIKit

var timer = NSTimer()

var seconds = 13

var milliseconds = 0

class ViewController: UIViewController {

    @IBOutlet weak var Label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        Label.text = "\(seconds).\(milliseconds)"
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func Button(sender: AnyObject) {

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

    }


    func countDownfunction() {

        Label.text = "\(seconds).\(milliseconds)"

        if milliseconds == 0 {

            seconds -= 1
            milliseconds = 100
        } else {
            milliseconds -= 1
        }

    }

}

编辑:新代码仍然没有想出来,但我认为正确的方式,我怎么能像我在的那样减去/比较两个字符串:Label.text =(countdownSeconds - elapsedTime) 它给了我一个错误,我不能' - '两个字符串,我不知道如何比较两秒。谢谢

import UIKit

class ViewController: UIViewController {


@IBOutlet weak var Label: UILabel!

var startTime = NSDate.timeIntervalSinceReferenceDate()

var currentTime = NSDate.timeIntervalSinceReferenceDate()

var elapsedTime = String()

var differenceTime = String()

var countdownSeconds = String()


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



@IBAction func Button(sender: AnyObject) {
    countdownSeconds = String(10)

    startTime = NSDate.timeIntervalSinceReferenceDate()

    NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("countDownUpdateMethod"), userInfo: nil, repeats: true)



}

func countDownUpdateMethod(){

    currentTime = NSDate.timeIntervalSinceReferenceDate()

    elapsedTime = String(currentTime - startTime )



    Label.text = (countdownSeconds - elapsedTime)



}



}

2 个答案:

答案 0 :(得分:1)

您忽略了计划和执行countDownfunction调用所需的时间。 NSTimer不会在100毫秒内给你回电话,因为电话正在做其他事情。它根本不会那么准确。此外,countDownfunction电话本身需要时间,而你却没有考虑到这一点。

您应该通过记录开始时间并检查countDownfunction内的当前时间来解决此问题,然后减去两者来设置标签。这样就可以弥补处理计时器的任何延迟。

您可以使用NSDate.timeIntervalSinceReferenceDate()获取当前时间。

答案 1 :(得分:0)

您是否注意到您将毫秒设置为100,而不是1000?

所以你的计时器在23秒内被召唤约1300次。这听起来是正确的。是什么让你觉得每秒倒数1000次是一个好主意?人们看不到。

如果您阅读NSTimer的文档,重复计时器将尝试在预期时间触发(因此它们在最后一次触发后不会触发X秒,但是它们会在计时器被触发后尝试触发X,2X,3X,4X秒如果在给定时间内没有触发计时器,则该触发器被丢弃。所以在23秒内你的计时器没有触发23,000次,而是1300次,正如人们所期望的那样。您无法每秒更新屏幕1,000次。如果可以,没有人能够看到它。

以合理的速度运行计时器,每秒不超过30次,并计算时间。不是基于倒计时,而是基于实际时间。