在Swift中失效后,Timer.fire()无效

时间:2015-08-29 03:25:50

标签: swift nstimer

使用后

@IBAction func pauseButton(sender: AnyObject) {
    if isPaused == false {

        timer.invalidate()
        isPaused = true
        displayLabel.text = "\(count)"
        println("App is paused equals \(isPaused)")

    } else if isPaused == true {
        var isPaused = false
        timer.fire()
        //  timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true)
    }
}

暂停应用程序,我想再次点击暂停,在这种情况下,计时器将继续从停止的位置开始计数。

此外,当我按下暂停/播放次数太多时,会发生多个定时器实例,这会导致定时器每秒增加几次。

请帮忙!

//
//  ViewController.swift
//  Navigation Bars
//
//  Created by Alex Ngounou on 8/27/15.
//  Copyright (c) 2015 Alex Ngounou. All rights reserved.
//


import UIKit

class ViewController: UIViewController {

    var timer = NSTimer()
    var count = 0
    var isPaused = false

    func updateTime() {

        switch count {
        case 0, 1:
            count++
        println( "\(count) second.")
        displayLabel.text = "\(count)"

        case 2:
            count++
            println("\(count) seconds.")
            displayLabel.text = "\(count)"

        default:
            count++
            println("\(count) seconds.")
            displayLabel.text = "\(count)"

        }
    }




    **strong text**@IBAction func playButton(sender: AnyObject) {

        var isPaused = false

         timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true)
    }


    @IBAction func stopButton(sender: AnyObject) {

        timer.invalidate()
        count = 0
        displayLabel.text = "0"
    }


    // if it's currently paused, pressing on the pause button again should restart the counter from where it originally left off.

    @IBAction func pauseButton(sender: AnyObject) {

        if isPaused == false {

        timer.invalidate()
        isPaused = true
        displayLabel.text = "\(count)"
        println("App is paused equals \(isPaused)")

        } else if isPaused == true {

            var isPaused = false

            timer.fire()

            //  timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true)
        }
    }


    @IBAction func resetButton(sender: AnyObject) {

        timer.invalidate()
        count = 0
        displayLabel.text = ""
    }


    @IBOutlet weak var displayLabel: UILabel!



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

    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true)
    }

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


}

3 个答案:

答案 0 :(得分:7)

来自:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/

  

一旦无效,就无法重复使用计时器对象。

所以基本上NSTimer一旦失效就什么都不做。必须在该点之后将timer属性分配给新构造的NSTimer对象才能再次触发它。如果您的无效记账是准确的,那么就没有"积累"多个计时器的问题。

但是,对于实际问题,最简单的方法可能是逻辑过滤。也就是说,让NSTimer对象无限期地保持不变,让它不断射击。当存储的属性isPausedtrue时,您会忽略计时器事件(通过立即从处理函数返回),否则您将处理它们。

答案 1 :(得分:1)

“懒惰”的方法可能会有用:

class ViewController: UIViewController {

    var timer: Timer?

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


    final func killTimer(){
        self.timer?.invalidate()
        self.timer = nil
    }


    final private func startTimer() {

        // make it re-entrant:
        // if timer is running, kill it and start from scratch
        self.killTimer()
        let fire = Date().addingTimeInterval(1)
        let deltaT : TimeInterval = 1.0

        self.timer = Timer(fire: fire, interval: deltaT, repeats: true, block: { (t: Timer) in

            print("hello")

        })

    RunLoop.main.add(self.timer!, forMode: RunLoopMode.commonModes)

    }

答案 2 :(得分:-1)

像这样将您的计时器声明为“弱变量”:

weak var timer: Timer?