快速使功能中的计时器失效



我正在尝试创建一个带有主比赛时钟和开始/停止按钮的曲棍球游戏时钟应用程序。但是我的停止游戏时钟功能遇到了问题。计时器不会失效。通过在这里搜索其他问题,我认为这与我的:

var gameclockTimer = NSTimer()

接缝 我不能使用此变量使计时器失效。我知道该功能有效,因为我可以看到"停止"

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

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

不幸的是,到目前为止,我找到的答案并没有帮助我,而无需将计时器和函数放在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
    }
}

最新更新