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