简体   繁体   English

使用NSUserdefaults在游戏中保存分数

[英]Save score in a game with NSUserdefaults

I've made this little app "How many fingers" where the user has to guess how many fingers the computer is holding behind it's back. 我制作了这个小应用程序“几根手指”,用户必须在其中猜测计算机背后支撑着多少根手指。 Now I want it to be able to save the users score with NSUserdefaults, but it's not working. 现在,我希望它能够使用NSUserdefaults保存用户分数,但是它不起作用。 Here is how my code looks right now: 这是我的代码现在的外观:

//
//  ViewController.swift
//  How many Fingers?
//
//  Created by Kevin Nguyen on 02.05.15.
//  Copyright (c) 2015 Kevin Nguyen. All rights reserved.
//

import UIKit

class ViewController: UIViewController {


    @IBOutlet var userGuess: UITextField!
    @IBOutlet var userScore: UILabel!
    @IBOutlet var userTotal: UILabel!
    @IBOutlet var result: UILabel!
    var score:Int = 0
    var totalGames:Int = 0

    @IBAction func resetScore(sender: AnyObject) {
        score = 0
        userScore.text = "0"
    }


    @IBAction func start(sender: AnyObject) {
        var userGuessInt = userGuess.text.toInt()
        var fingers = Int(arc4random_uniform(6))
        if userGuessInt <= 5 {
            if userGuessInt == fingers {
                result.text = "Great! You were right!"
                score++
                totalGames++
                userScore.text = "\(score)"
                userTotal.text = "\(totalGames)"
                println("User score is \(score); total games is \(totalGames)")
                NSUserDefaults.standardUserDefaults().setObject(score, forKey: "svScore")
                NSUserDefaults.standardUserDefaults().setObject(totalGames, forKey: "svTotalGames")
            } else {
                result.text = "Try Again!"
                println("User score is \(score); total games is \(totalGames)")
                totalGames++
                userTotal.text = "\(totalGames)"
                NSUserDefaults.standardUserDefaults().setObject(score, forKey: "svScore")
                NSUserDefaults.standardUserDefaults().setObject(totalGames, forKey: "svTotalGames")
            }

        } else{
            result.text = "Enter a number from 0 up to 5!"
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        if score != 0 {
            var score:Int = NSUserDefaults.standardUserDefaults().objectForKey("svScore")! as! Int
            userScore.text = "\(score)"
        }
        if totalGames != 0 {
            var totalGames:Int = NSUserDefaults.standardUserDefaults().objectForKey("svTotalGames")! as! Int
            userTotal.text = "\(totalGames)"
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

When your application starts the score in viewDidLoad is always 0 . 当您的应用程序启动时, viewDidLoadscore始终为0 So you'll never read the saved data (because of your if condition). 因此,您将永远不会读取已保存的数据(由于if条件)。 You should also check it there is data stored before you try to use it. 在尝试使用之前,还应检查是否已存储数据。

Change it like that: 像这样更改它:

override func viewDidLoad() {
    super.viewDidLoad()

    if (NSUserDefaults.standardUserDefaults().objectForKey("svScore") != nil) {
        score = NSUserDefaults.standardUserDefaults().objectForKey("svScore")! as! Int
    }
    if score != 0 {
        userScore.text = "\(score)"
    }

    if (NSUserDefaults.standardUserDefaults().objectForKey("svTotalGames") != nil) {
         totalGames = NSUserDefaults.standardUserDefaults().objectForKey("svTotalGames")! as! Int
    }
    if totalGames != 0 {
        userTotal.text = "\(totalGames)"
    }
}
//To Save Highscore
NSUserDefaults.standardUserDefaults().setInteger(highScore, forKey: "highscore")
//To Call For Highscore
var highScore:Int = NSUserDefaults.standardUserDefaults().integerForKey("highscore")

You could create a HighscoreSaver-util class like that: 您可以这样创建一个HighscoreSaver-util类:

class HighscoreSaver {
    private let defaults = NSUserDefaults.standardUserDefaults()
    private let highscoreKey = "highscore-saver-key-item"
    private var highscore:Int = 0

    private func updateHighscore(score:Int){
        highscore += score
        if defaults.integerForKey(highscoreKey) < highscore{
            defaults.setInteger(highscore, forKey: highscoreKey)
        }
    }

    func add(score scoreToAdd:Int){
        updateHighscore(scoreToAdd)
    }

    func reset(){
        defaults.removeObjectForKey(highscoreKey)
    }

    func currentHighscore() -> Int{
        return highscore
    }
}

The usage would be like that: 用法如下:

var high = HighscoreSaver()

//Adds scorevalue to current score
high.add(score: yourScoreToAddToCurrent)

//Resets the score to 0
high.reset()

//Gets current score
high.currentHighscore()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM