快速按下主页按钮时暂停计时器

时间:2015-07-18 19:58:31

标签: ios xcode swift timer

我的GameScene.swift中有一堆定时器可以调用函数。当用户点击或双击主页按钮,获取短信等时,如何暂停这些计时器?现在,当游戏运行时双击主页按钮时,基于计时器的分数会持续上升并且仍会产生敌人。

    //Spawn timer for enemy blocks
    var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true)

    //Timer for keeping score
    var scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true)

非常感谢任何帮助!

编辑: 我将这两行添加到我的GameViewController.swift

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("pauseTimers:"), name:UIApplicationWillResignActiveNotification, object: nil)

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("startTimers:"), name:UIApplicationDidBecomeActiveNotification, object: nil)

然后是这两个功能:

func pauseTimers(notification : NSNotification) {
    println("Observer method called")
    timer.invalidate()
    scoretimer.invalidate()
}

func startTimers(notification : NSNotification) {
    println("Observer method called")
    timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true)
    scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true)
}

但是,我收到一个错误,因为当我在startTimers中重新创建计时器时,它们的选择器是我的GameScene.swift中的函数,而不是GameViewController.swift。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您可以通过调用invalidate()来停止计时器。虽然无效的计时器永远不会再次运行,但如果您希望它再次触发,您需要稍后重新创建它。

要检测您的应用何时进入后台或被中断以及何时返回前台,您可以收听这些通知:

  • UIApplicationDidBecomeActiveNotification
  • UIApplicationWillResignActiveNotification
  • UIApplicationDidEnterBackgroundNotification
  • UIApplicationWillEnterForegroundNotification

应用程序在被覆盖时“重新启动”,例如因为有来电或是因为通知中心/控制中心已打开。一个应用程序进入后台,当另一个应用程序进入前台或显示主屏幕时(这在技术上也是一个应用程序)。

enter image description here

<强> @Update

问题是计时器的目标self,当您在GameViewController时,selfGameViewController个实例。您需要在GameScene内重新创建计时器,或者您需要将引用传递给GameScene实例而不是self作为目标选择器是被调用的方法,目标是调用该方法的对象,self始终是当前对象。

BTW可以在任何课程中同时收听这些通知,也可以同时在多个班级中收听。