如何使用NSTimer以分钟和秒为单位更新标签的经过时间?

时间:2016-05-08 19:47:49

标签: swift nstimer

我让计时器倒计时但我遇到了麻烦:

  1. 让计时器在达到0时连续重新开始
  2. 这样倒计时:4:00,3:59,3:58 ......而不是240,239,238 ......
  3. 这是我的代码:

    ViewController: UIViewController {
    
        @IBOutlet weak var incomeTimeLabel: UILabel!
        var timer: NSTimer!
        let startIncomeTime = 240
        var incomeTime = 240
    
        func startTimer() {
            timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, 
                        selector: #selector(ViewController.timerStarted),
                        userInfo: nil, repeats:  true)
        }
    
        func timerStarted() {
            incomeTimer()
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
            startTimer()
        }
    
        func incomeTimer() {
            if incomeTime > -1 {
                incomeTimeLabel.text = String(incomeTime--)
            } else if incomeTime == -1 {
                incomeTimeLabel.text = String(startIncomeTime)
            }
        }
    }
    

    我一直在教自己编写代码只有几个月,但我觉得这是一种更有效的方法,所以你认为有帮助的任何其他建议都会非常感激。

1 个答案:

答案 0 :(得分:0)

您似乎对NSTimer的内容感到困惑。它不是"计时器"像秒表。它提供了一种以特定间隔异步执行方法的方法(例如,"每1秒调用一次这种方法")。

虽然以下内容有点过分,但它使用MVC来说明这一点。代码示例取自"Teaching App Development with Swift" Stopwatch project

模型 Stopwatch.swift

import Foundation

class Stopwatch {

    private var startTime: NSDate?

    var elapsedTime: NSTimeInterval {
        if let startTime = self.startTime {
            return -startTime.timeIntervalSinceNow
        } else {
            return 0
        }
    }

    var elapsedTimeAsString: String {
        return String(format: "%02d:%02d.%d",
            Int(elapsedTime / 60),
            Int(elapsedTime % 60),
            Int(elapsedTime * 10 % 10))
    }

    var isRunning: Bool {
        return startTime != nil
    }

    func start() {
        startTime = NSDate()
    }

    func stop() {
        startTime = nil
    }

}

控制器 ViewController.swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var elapsedTimeLabel: UILabel!
    let stopwatch = Stopwatch()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func startStopwatch(sender: UIButton) {
        NSTimer.scheduledTimerWithTimeInterval(0.1, target: self,
            selector: "updateElapsedTimeLabel:", userInfo: nil,
            repeats: true)
        stopwatch.start()
    }

    @IBAction func stopStopwatch(sender: UIButton) {
        stopwatch.stop()
    }

    func updateElapsedTimeLabel(timer: NSTimer) {
        if stopwatch.isRunning {
            elapsedTimeLabel.text = stopwatch.elapsedTimeAsString
        } else {
            timer.invalidate()
        }
    }

}

换句话说,你需要做你的时间数学"使用NSDate个对象,而不是Int s。

要获得您在问题中提到的功能#1,您可以更改updateElapsedTimeLabel:中的逻辑,以便在stopwatch.elapsedTimeNSDate"之间的差异时调用函数从现在开始四分钟"是0。

要获得倒计时功能#2,只需添加一个方法timeLeft即可返回NSDate"从现在起四分钟之间的差异"和elapsedTime。

这里的要点是了解NSTimer的工作原理,如何使用NSDate来计算两个时刻之间的差异,以及如何使用格式字符串来显示您想要的内容。这里有足够的原材料供您实施自己的要求。