Ios 快速使计时器失效

Ios 快速使计时器失效,ios,swift,timer,Ios,Swift,Timer,我正在尝试创建一个曲棍球游戏时钟应用程序,其中包含一个游戏主时钟和一个开始/停止按钮。但是我的秒表功能有问题。计时器不会失效。从这里搜索的其他问题来看,我认为这与我的: var gameclockTimer = NSTimer() 我不能使用这个变量使计时器无效。 我知道该函数可以工作,因为我可以看到“停止” 有没有办法让这个函数使我的计时器失效 不幸的是,如果不将计时器和函数放入ViewController类中,到目前为止我找到的答案对我没有帮助 我希望将计时器保留在单独的类中的原因是因为稍

我正在尝试创建一个曲棍球游戏时钟应用程序,其中包含一个游戏主时钟和一个开始/停止按钮。但是我的秒表功能有问题。计时器不会失效。从这里搜索的其他问题来看,我认为这与我的:

var gameclockTimer = NSTimer()
我不能使用这个变量使计时器无效。 我知道该函数可以工作,因为我可以看到“停止”

有没有办法让这个函数使我的计时器失效

不幸的是,如果不将计时器和函数放入ViewController类中,到目前为止我找到的答案对我没有帮助

我希望将计时器保留在单独的类中的原因是因为稍后我将添加几个惩罚时钟/计时器,并且我希望将它们保留在单独的类中,以便于查看

到目前为止,完整的代码如下所示:

//  ViewController.swift

import UIKit

class ViewController: UIViewController {

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

override func viewDidLoad() {
    super.viewDidLoad()
    gameclockLabel.text = "00:00"
}

var startstopPushed: Bool = false

@IBOutlet weak var gameclockLabel: UILabel!
@IBOutlet weak var startstop: UIButton!
@IBAction func startStopbutton(sender: AnyObject) {

    if startstopPushed == false {

        Gameclock().startGameclock()
        startstop.setImage(UIImage(named: "stop.png"), forState: UIControlState.Normal)
        startstopPushed = true
    }
    else
    {
        Gameclock().stopGameclock()
        startstop.setImage(UIImage(named: "start.png"), forState: UIControlState.Normal)
        startstopPushed = false
    }

}

}


class Gameclock : NSObject {

var gameclockTimer = NSTimer()
var timeString: String = ""
var seconds = 0
var minutes = 0

func startGameclock() {

   gameclockTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateGameclock"), userInfo: nil, repeats: true)

}

func stopGameclock() {
    self.gameclockTimer.invalidate() 
    print("stop")
}

func updateGameclock() {

    seconds += 1

    if seconds == 60 {

        minutes += 1
        seconds = 0

    }

    let secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)"
    let minutesString = minutes > 9 ? "\(minutes)" : "0\(minutes)"


    timeString = "\(minutesString):\(secondsString)"
    print(timeString)

}
}

问题是,每次访问GameClock时,您都在创建它的新实例,因此您要停止的实例不是您创建的实例

您可以在
GameClock
类中保留所有功能,但需要在
ViewController
中定义一个变量才能访问它

class ViewController: UIViewController {
    var gameClock = Gameclock()
然后在
startstopPushed
方法中进行这些更改

    if startstopPushed == false {

        //Gameclock().startGameclock()
        gameClock.startGameclock()
        startstop.setImage(UIImage(named: "stop.png"), forState: UIControlState.Normal)
        startstopPushed = true
    }
    else
    {
        //Gameclock().stopGameclock()
        gameClock.stopGameclock()
        startstop.setImage(UIImage(named: "start.png"), forState: UIControlState.Normal)
        startstopPushed = false
    }

我认为这应该奏效:

我只创建了一个代表游戏时钟类的var gameClock,然后在这个类上运行这些方法

override func viewDidLoad() {
    super.viewDidLoad()
    gameclockLabel.text = "00:00"
}

var startstopPushed: Bool = false
var gameClock = GameClock()

@IBOutlet weak var gameclockLabel: UILabel!
@IBOutlet weak var startstop: UIButton!
@IBAction func startStopbutton(sender: AnyObject) {

    if startstopPushed == false {

        gameClock.startGameclock()
        startstop.setImage(UIImage(named: "stop.png"), forState: UIControlState.Normal)
        startstopPushed = true
    }
    else
    {
        gameClock.stopGameclock()
        startstop.setImage(UIImage(named: "start.png"), forState: UIControlState.Normal)
        startstopPushed = false
    }

}

当你开始创建游戏时钟对象时,我认为这就是问题所在(不确定),但是当你试图停止它时,你创建了另一个对象并停止了它。谢谢你的回答。就是这样。
override func viewDidLoad() {
    super.viewDidLoad()
    gameclockLabel.text = "00:00"
}

var startstopPushed: Bool = false
var gameClock = GameClock()

@IBOutlet weak var gameclockLabel: UILabel!
@IBOutlet weak var startstop: UIButton!
@IBAction func startStopbutton(sender: AnyObject) {

    if startstopPushed == false {

        gameClock.startGameclock()
        startstop.setImage(UIImage(named: "stop.png"), forState: UIControlState.Normal)
        startstopPushed = true
    }
    else
    {
        gameClock.stopGameclock()
        startstop.setImage(UIImage(named: "start.png"), forState: UIControlState.Normal)
        startstopPushed = false
    }

}