swift使函数中的计时器无效

时间:2016-03-05 10:14:34

标签: ios swift timer

我正在尝试使用主游戏时钟和开始/停止按钮创建一个曲棍球游戏时钟应用程序。但我的stopGameclock功能有问题。计时器不会失效。从这里搜索其他问题我认为它与我的相关:

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

接缝我无法使用此var来使计时器无效。 我知道这个功能有效,因为我可以看到“停止”

//  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)

}
}

有没有办法让这个功能使我的计时器无效?

不幸的是,到目前为止我找到的答案并没有帮助我而不需要将计时器和函数放在ViewController类中。

我想将计时器保存在一个单独的类中的原因是因为稍后我将添加几个惩罚时钟/计时器,我希望将它们放在单独的类中以便于概述。

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

{{1}}

2 个答案:

答案 0 :(得分:1)

问题在于,每次您访问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
    }

答案 1 :(得分:0)

我认为这应该有效:

我创建一个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
    }

}