NSTimeInterval作为倒数计时器,将其作为单独的可重用类应用

时间:2014-11-26 01:22:44

标签: ios swift

编辑:我是个白痴。我试图将变量放入NSTimer()而不是NSTimeInterval,无论出于何种愚蠢的原因。我想我的问题是如何将它全部包装在一个单独的类中?

理想情况下,我希望所有这些都包含在一个单独的类(CountdownTimer)中,因此我可以创建一个新的计时器实例,但仍保留NSTimer包含的所有功能作为检查timer.isValid的能力。 Psuedocode看起来像:

var timer = CountdownTimer(countDownFrom: 300) 
timer.start()
timer.isValid()

我的UIViewController课程(不在viewDidLoad中):

var totalCountDownTimeInterval = NSTimeInterval(480.0)

var startTime = NSDate()

var timer = NSTimer()
var isRunning = false

func updateTime() {
    var elapsedTime : NSTimeInterval  = NSDate().timeIntervalSinceDate(startTime)
    var remainingTime : NSTimeInterval = totalCountDownTimeInterval - elapsedTime

    if remainingTime <= 0.0 {
        timer.invalidate()
    }

    let minutes = UInt8(remainingTime / 60.0)
    remainingTime = remainingTime - (NSTimeInterval(minutes) * 60)

    let seconds = UInt8(remainingTime)
    println("The time is \(minutes) and \(seconds)")

}


@IBOutlet weak var TimerCount: UILabel!


@IBAction func StartButton(sender: AnyObject) {
    if !timer.valid {
        startTime = NSDate()
        let aSelector : Selector = "updateTime"
        timer = NSTimer.scheduledTimerWithTimeInterval(0.10, target: self, selector: aSelector, userInfo: nil, repeats: true)
    }
}


@IBAction func StopButton(sender: AnyObject) {
    timer.invalidate()
}

@IBAction func ResetButton(sender: AnyObject) {
    timer.invalidate()
    TimerCount.text = "00:00"
}

2 个答案:

答案 0 :(得分:1)

我在Xcode 6.1的操场上试过这个代码,而且工作正常。 那很奇怪......

let someValue: Double = 60.0
var timeInterval = NSTimeInterval(someValue)
println(timeInterval)

答案 1 :(得分:1)

确保你实际上是在传递双倍。当我声明变量时,我喜欢明确说明变量的类型;它有助于避免像这样的问题。

您最有可能声明doubleValue这样:

let doubleValue = 480

而不是像这样:

let doubleValue = 480.0

或者像这样:

let doubleValue: Double = 480

如果您已正确声明变量,则此 应该工作:

let timeInterval = NSTimeInterval(doubleValue)

如果您要让编译器推断变量的类型,只需确保赋值运算符右侧的任何内容都评估为您要查找的类型。当480评估为Int(480)时,480.0评估为Double(480)


编辑:以下是您的第二个问题的答案:如何将此[计时器功能]包装在一个单独的课程中?

实际上非常简单。假设您要对课程做的所有事情都是为了能够启动它并检查它是否仍然有效,那么我将如何做到这一点:

class CountdownTimer
{
    var time: NSTimeInterval

    private var startTime: NSDate?

    init(countDownFrom timeInSeconds: Int)
    {
        time = NSTimeInterval(timeInSeconds)
    }

    func start()
    {
        startTime = NSDate()
    }

    func isValid() -> Bool
    {
        if (startTime != nil)
        {
            let timePassed: NSTimeInterval = -(startTime!.timeIntervalSinceNow)

            return timePassed < time
        }
        else
        {
            return false
        }
    }
}

现在,请注意,我几乎没有测试过这个。游乐场不是抱怨,从它的外观来看,这应该有效。现在,只需使用这样的类:

var myCountdownTimer = CountdownTimer(countDownFrom: 300)

// and then whenever we want to start the countdown:

myCountdownTimer.start()

// and then whenever we want to check if the clock's still "ticking", so to speak:

myCountdownTimer.isValid()

// and if we want to restart the timer:

myCountdownTimer.time = NSTimeInterval(900) // we can change the time if we want
myCountdownTimer.start()

基本上,所有CountdownTimer对象都会将调用的确切时间start()保存到名为startTime的变量中。请注意,默认情况下NSDate()设置为创建的时间和日期。然后isValid()只是检查timePassed是否小于定时器设置为倒计时的time;如果是,则返回true