使用NSuserdefaults在Swift和Sprite Kit中设置HighScore

时间:2014-08-30 22:32:19

标签: xcode swift nsuserdefaults

我正在构建一个快速的游戏并且需要设置一个高分,我一直试图弄清楚如何做一段时间。那么请你告诉我如何搜索这个库,看看是否已经保存了高分,然后将其与用户的分数进行比较。我试过这个,但它不会工作。请帮助并尽可能清楚。给我示例代码将非常感激。

    if let highscore: AnyObject = NSUserDefaults.valueForKey("highscore") { 
      var savedScore: Int = NSUserDefaults.standardUserDefaults().objectForKey("highScore") as Int
        if ( savedScore < Score) { 
            var highscore = Score
            NSUserDefaults.standardUserDefaults().setObject(highscore, forKey:"highscore")
            NSUserDefaults.standardUserDefaults().synchronize() }
    }
    else { 
        var highscore = Score
        NSUserDefaults.standardUserDefaults().setObject(highscore, forKey:"highscore")
        NSUserDefaults.standardUserDefaults().synchronize()
   }

2 个答案:

答案 0 :(得分:17)

使用单一视图应用程序模板在Xcode中创建一个新的iOS项目。然后,使用以下代码替换ViewController.swift的内容:

import UIKit

class ViewController: UIViewController {

    var generator = [6, 12, 8].generate()

    override func viewDidLoad() {
        super.viewDidLoad()

        let button = UIButton(type: .System)
        button.setTitle("Button", forState: .Normal)
        button.addTarget(self, action: "newScore", forControlEvents: .TouchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(button)

        // Auto layout code using anchors (requires iOS9+)
        let horizontalConstraint = button.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor)
        let verticalConstraint = button.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor)
        NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint])

        // Print NSUserDefaults's highscore value when app is launched
        print("highscore:", NSUserDefaults.standardUserDefaults().integerForKey("highscore"))
    }

    func newScore() {
        guard let score = generator.next() else { return }
        print("current score:", score)

        //Check if score is higher than NSUserDefaults stored value and change NSUserDefaults stored value if it's true
        if score > NSUserDefaults.standardUserDefaults().integerForKey("highscore") {
            NSUserDefaults.standardUserDefaults().setInteger(score, forKey: "highscore")
            NSUserDefaults.standardUserDefaults().synchronize()
        }

        print("highscore:", NSUserDefaults.standardUserDefaults().integerForKey("highscore"))
    }

}

在iPhone或模拟器上构建并运行项目。 Xcode控制台将打印0,这是NSUserDefaults.standardUserDefaults().integerForKey("highscore")的当前值。

现在,点击按钮。这会将score的值设置为6,因为6 > 0NSUserDefaults.standardUserDefaults().integerForKey("highscore")将获得此新值。

再次单击按钮。这会将score的值设置为12。您将立即在控制台中看到NSUserDefaults.standardUserDefaults().integerForKey("highscore")获得此新值。

现在,如果您通过点击按钮将score的值更改为8,您会看到NSUserDefaults.standardUserDefaults().integerForKey("highscore")的值仍为12,因为{{ 1}}。

如果您重建项目并重新启动它,您将看到8 < 12是持久的(其值仍然是12并且尚未重置)。因此,NSUserDefaults.standardUserDefaults().integerForKey("highscore")可以成为存储玩家最高分的完美工具。


额外提示

NSUserDefaults始终返回NSUserDefaults.standardUserDefaults().integerForKey("highscore")(如果您未自行设置,则会返回Int,而不是0)。因此,您不需要/不能使用可选绑定。如果您真的想要处理可选的值返回,您会更喜欢nil

答案 1 :(得分:1)

var defaults=NSUserDefaults()
var highscore=defaults.integerForKey("highscore")

if(Score>highscore)
{
    defaults.setInteger(Score, forKey: "highscore")
}
var highscoreshow=defaults.integerForKey("highscore")

lblHighScore.text="\(highscoreshow)"
println("hhScore reported: \(lblHighScore.text)")
lblPlayScore.text="\(Score)"
println("play reported: \(lblPlayScore.text)")