定时器每次减一
Timer Subtracting One More Every Time
我有一个游戏计时器,可以为整个游戏计时。它第一次工作,但当我回到那个视图再次播放时,它每秒减去 2。下一次3等等。
var masterTimer: NSTimer? = nil
然后在 viewDidLoad 中我有:
self.masterTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "fulltime", userInfo: nil, repeats: true)
这是全职工作:
func fulltime() {
var FullTime = defaults.integerForKey("FullTime")
var ScoreType = defaults.integerForKey("ScoreType")
FullTime -= 1 //take a second away
if (FullTime > 0)
{
TimerLabel.text = String(FullTime)
defaults.setInteger(FullTime, forKey: "FullTime")
}
else
{
if ScoreType == 1 {
defaults.setInteger(Score, forKey: "Score1")
defaults.synchronize()
}
else if ScoreType == 2 {
defaults.setInteger(Score, forKey: "Score2")
defaults.synchronize()
}
else if ScoreType == 3 {
defaults.setInteger(Score, forKey: "Score3")
defaults.synchronize()
}
else if ScoreType == 4 {
defaults.setInteger(Score, forKey: "Score4")
defaults.synchronize()
}
else if ScoreType == 5 {
defaults.setInteger(Score, forKey: "Score5")
defaults.synchronize()
}
else if ScoreType == 6 {
defaults.setInteger(Score, forKey: "Score6")
defaults.synchronize()
}
else if ScoreType == 7 {
defaults.setInteger(Score, forKey: "Score7")
defaults.synchronize()
}
else if ScoreType == 8 {
defaults.setInteger(Score, forKey: "Score8")
defaults.synchronize()
}
else if ScoreType == 9 {
defaults.setInteger(Score, forKey: "Score9")
defaults.synchronize()
}
ScoreString = String(Score)
ScoreLabel.text = ScoreString
let controller = storyboard?.instantiateViewControllerWithIdentifier("HighScore") as HighScore
presentViewController(controller, animated: true, completion: nil)
}
}
您之前拥有的计时器不会仅仅因为您将新计时器重新分配给 masterTimer 变量而停止触发,或者因为 masterTimer 变量不再存在,因为它所属的对象已被释放,您实际上需要先取消再开始新的
使用 scheduledTimerWith... 方法创建的计时器将自动添加到当前 运行 循环中,并保持 运行ning 独立于您是否为它们保留引用这一事实。所以基本上当你离开屏幕时它会继续运行,除非你使它无效。
您可以通过调用计时器的无效方法来实现。
if(self.masterTimer != nil){
self.masterTimer!.invalidate()
}
您应该确保在计时器不再有用时调用计时器的 invalidate 方法。
在你的情况下,可能在你的 viewController 的 viewWillDisappear、viewDidDisappear 方法中,在你的游戏逻辑的某些方法中,比如当前游戏结束或者可能在 dealloc 方法中。
我有一个游戏计时器,可以为整个游戏计时。它第一次工作,但当我回到那个视图再次播放时,它每秒减去 2。下一次3等等。
var masterTimer: NSTimer? = nil
然后在 viewDidLoad 中我有:
self.masterTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "fulltime", userInfo: nil, repeats: true)
这是全职工作:
func fulltime() {
var FullTime = defaults.integerForKey("FullTime")
var ScoreType = defaults.integerForKey("ScoreType")
FullTime -= 1 //take a second away
if (FullTime > 0)
{
TimerLabel.text = String(FullTime)
defaults.setInteger(FullTime, forKey: "FullTime")
}
else
{
if ScoreType == 1 {
defaults.setInteger(Score, forKey: "Score1")
defaults.synchronize()
}
else if ScoreType == 2 {
defaults.setInteger(Score, forKey: "Score2")
defaults.synchronize()
}
else if ScoreType == 3 {
defaults.setInteger(Score, forKey: "Score3")
defaults.synchronize()
}
else if ScoreType == 4 {
defaults.setInteger(Score, forKey: "Score4")
defaults.synchronize()
}
else if ScoreType == 5 {
defaults.setInteger(Score, forKey: "Score5")
defaults.synchronize()
}
else if ScoreType == 6 {
defaults.setInteger(Score, forKey: "Score6")
defaults.synchronize()
}
else if ScoreType == 7 {
defaults.setInteger(Score, forKey: "Score7")
defaults.synchronize()
}
else if ScoreType == 8 {
defaults.setInteger(Score, forKey: "Score8")
defaults.synchronize()
}
else if ScoreType == 9 {
defaults.setInteger(Score, forKey: "Score9")
defaults.synchronize()
}
ScoreString = String(Score)
ScoreLabel.text = ScoreString
let controller = storyboard?.instantiateViewControllerWithIdentifier("HighScore") as HighScore
presentViewController(controller, animated: true, completion: nil)
}
}
您之前拥有的计时器不会仅仅因为您将新计时器重新分配给 masterTimer 变量而停止触发,或者因为 masterTimer 变量不再存在,因为它所属的对象已被释放,您实际上需要先取消再开始新的
使用 scheduledTimerWith... 方法创建的计时器将自动添加到当前 运行 循环中,并保持 运行ning 独立于您是否为它们保留引用这一事实。所以基本上当你离开屏幕时它会继续运行,除非你使它无效。
您可以通过调用计时器的无效方法来实现。
if(self.masterTimer != nil){
self.masterTimer!.invalidate()
}
您应该确保在计时器不再有用时调用计时器的 invalidate 方法。 在你的情况下,可能在你的 viewController 的 viewWillDisappear、viewDidDisappear 方法中,在你的游戏逻辑的某些方法中,比如当前游戏结束或者可能在 dealloc 方法中。