我正在制作一个点击游戏,我需要在关闭应用程序后让我的NSTimers继续。我先看了这个,但我找不到合适的Swift答案。我想我可以使用UserDefaults,但我不知道如何应用它。很抱歉,如果这是一个重复的问题,我知道有很多相关信息。
var timerVar = NSTimer.scheduledTimerWithTimeInterval(4, target: self,
selector: Selector("selectorName"), userInfo: nil, repeats: true)
func selectorName(){
var ScoreDefault = NSUserDefaults.standardUserDefaults()
ScoreDefault.setValue(Score, forKey: "Score")
ScoreDefault.synchronize()
Score+=1
scoreLbl.text = "\(Score)"
}
答案 0 :(得分:0)
您无法暂停和继续计时器。您必须使其无效,然后创建一个新的。记录启动计时器时的时间,然后暂停时,计算经过的时间并使用它来计算剩余时间。使用您计算的剩余时间量创建一个新计时器。
答案 1 :(得分:0)
这并没有解决所要求的内容,但也许对其他人有用。
iOS应用无法在后台任意运行,如Background Execution in Apple’s App Programming Guide for iOS中所述。使用电池非常低效,每4秒唤醒一次你的应用程序以增加一个计数器;想象一下,如果每个应用程序都这样做,并且安装了数请参阅Minimize Timer Use in Apple’s Energy Efficiency Guide for iOS Apps。
相反,存储您上次更新分数的时间,然后当您的应用再次运行时,它可以计算从现在起的差异并相应地更新分数。我会说即使应用程序位于前台,计算分数也是一个更好的设计。
您可以使用CFAbsoluteTimeGetCurrent
功能或NSDate()
获取当前时间。
代码风格:这与问题无关,但如果我决定编写该方法,我会做一些不同的事情:
func incrementScore() {
score += 1
let defaults = NSUserDefaults.standardUserDefaults()
defaults.setValue(score, forKey: "Score")
scoreLabel.text = "\(score)"
}
let
代替var
作为标准用户默认参考,因为它不会更改。ScoreDefaults
。这是共享的标准用户默认对象,不是特定于分数。答案 2 :(得分:0)
好的我明白了。然而,它并不漂亮但有效我会发布代码,也许有人可以清理它或使用不同的方法。我最终创建了另一个名为scoreIncrementor的变量,然后在didMoveToView中创建了一个NSTimer,每秒运行一次简单的score = score + scoreincrementor。以下是任何人都需要它的代码随时编辑你心中的喜悦。为此,我还制作了另一个标签,以查看正在添加的内容" tempScoreLbl"。
var ScoreIncrementor = Double()
var Score = Double()
var scoreLbl: UILabel!
var tempscoreLbl: UILabel!
override func didMoveToView(view: SKView) {
var ScoreDefault = NSUserDefaults.standardUserDefaults()
if (ScoreDefault.valueForKey("Score") != nil){
Score = ScoreDefault.valueForKey("Score") as! Double
}
ScoreDefault.setValue(Score, forKey: "Score")
ScoreDefault.synchronize()
var ScoreIncrementorDefault = NSUserDefaults.standardUserDefaults()
if (ScoreIncrementorDefault.valueForKey("ScoreIncrementor") != nil){
ScoreIncrementor = ScoreIncrementorDefault.valueForKey("ScoreIncrementor") as! Double
}
ScoreIncrementorDefault.setValue(ScoreIncrementor, forKey: "ScoreIncrementor")
ScoreIncrementorDefault.synchronize()
let scorePerSecond = NSTimer.scheduledTimerWithTimeInterval(1 , target: self, selector: Selector("permanentIncrementor"),userInfo: nil, repeats: true)
self.view?.addSubview(scoreLbl)
self.view?.addSubview(tempscoreLbl)
}
func permanentIncrementor(){
Score = Score + ScoreIncrementor
var ScoreDefault = NSUserDefaults.standardUserDefaults()
ScoreDefault.setValue(Score, forKey: "Score")
ScoreDefault.synchronize()
scoreLbl.text = "\(Score)"
}
func gloveUpgrade(){
if Score >= 50{
let scorePerSecond = NSTimer.scheduledTimerWithTimeInterval(0 , target: self, selector: Selector("gloveUpgradeTimer"),userInfo: nil, repeats: false)
var ScoreIncrementorDefault = NSUserDefaults.standardUserDefaults()
ScoreIncrementorDefault.setValue(ScoreIncrementor, forKey: "ScoreIncrementor")
ScoreIncrementorDefault.synchronize()
Score-=50
tempscoreLbl.text = "\(ScoreIncrementor)"
}
}
func gloveUpgradeTimer(){
//increase score per minute by .25
var ScoreIncrementorDefault = NSUserDefaults.standardUserDefaults()
ScoreIncrementorDefault.setValue(ScoreIncrementor, forKey: "ScoreIncrementor")
ScoreIncrementorDefault.synchronize()
ScoreIncrementor+=0.25
tempscoreLbl.text = "\(ScoreIncrementor)"
}