Использование UserDefaults для хранения результатов в кликерной игре (Swift 5) - PullRequest
1 голос
/ 29 января 2020

Сделали простую пошаговую игру. Я хочу, чтобы, даже если я go выберу другой V C и затем вернусь в игру или снова открою игру, он покажет текущий счет. Моя проблема в том, что если я покину игру, то счет вернется к нулю. Я не хочу, чтобы это произошло. Оценка не должна сбрасываться. Я слышал, что могу использовать UserDefaults, но я совсем не знаком с ним. Если вы можете объяснить, используя код, это было бы лучше. Спасибо.

import UIKit

class CookieClickerVC: UIViewController {

@IBOutlet weak var goldLabel: UILabel!
@IBOutlet weak var numberOfGold: UILabel!
@IBOutlet weak var getGoldButton: UIButton!

override func viewDidLoad() {
    super.viewDidLoad()
    formatItems()
    let defaults = UserDefaults.standard
    defaults.set(0, forKey: "goldCount")

}



@IBAction func getGoldClicked(_ sender: Any) {
    goldCount += 1
    numberOfGold.text = ("\(goldCount)")
}`

также, возможно, вы уже выяснили, но goldCount - это неразрешенный идентификатор. Как изменить код после нажатия кнопки?

Ответы [ 5 ]

7 голосов
/ 29 января 2020

Вы можете использовать эти funtions, чтобы получить и установить счет

class CookieClickerVC: UIViewController {

    @IBOutlet weak var goldLabel: UILabel!
    @IBOutlet weak var numberOfGold: UILabel!
    @IBOutlet weak var getGoldButton: UIButton!


   lazy var goldCount : Int = 0 {
         didSet {
        numberOfGold.text = ("\(goldCount)")
       }
   }

   override func viewDidLoad() {
        super.viewDidLoad()
        formatItems()
        goldCount = getScore()

    }

    @IBAction func getGoldClicked(_ sender: Any) {
        goldCount += 1
        savescore(goldCount)
    }

    //  Save and Get methods ..

    func saveScore(_ score:Int) {
            let defaults = UserDefaults.standard
            defaults.set(score, forKey: "goldCount")
          //  defaults.synchronize() its [unnecessary][1] 
        }

// defaults.synchronize (), его не нужно

    func getScore()-> Int {
          let defaults = UserDefaults.standard
          return  defaults.integer(forKey: "goldCount")
        }
}
5 голосов
/ 29 января 2020

Шаг 1: объявите переменную goldCount и установите начальное значение на 0

Шаг 2: на viewDidLoad, получите значение сохраняется в UserDefaults и устанавливается на goldCount

Шаг 3: Также обновите вашу метку

Шаг 4: Обновите значение goldCount в userDefaults

import UIKit

class CookieClickerVC: UIViewController {

    @IBOutlet weak var goldLabel: UILabel!
    @IBOutlet weak var numberOfGold: UILabel!
    @IBOutlet weak var getGoldButton: UIButton!

    //Step1: declare your goldCount variable and set initial value to 0
    var goldCount = 0

    override func viewDidLoad() {
        super.viewDidLoad()
        formatItems()
        //Step2: on viewDidLoad, get the value stored in the UserDefaults and set it to goldCount
        goldCount = UserDefaults.standard.integer(forKey: "goldCount")
        //Step3: then also update your label
        numberOfGold.text = ("\(goldCount)")


    }

    @IBAction func getGoldClicked(_ sender: Any) {
        goldCount += 1
        numberOfGold.text = ("\(goldCount)")
        //Step4: update the value of goldCount in userDefaults
        UserDefaults.standard.set(goldCount, forKey: "goldCount")
    }
}
2 голосов
/ 29 января 2020

Вы можете изменить функцию viewDidLoad, чтобы сначала проверить UserDefaults для ключа «goldCount», и, если он имеет значение, используйте его. Если не просто установить счет на 0.

override func viewDidLoad() {
    super.viewDidLoad()
    formatItems()
    let defaults = UserDefaults.standard

    if let savedScore = defaults.value(forKey: "goldCount") as? Int {
        goldCount = savedScore
    } else {
        defaults.set(0, forKey: "goldCount")
    }
}

Вы можете определить "goldCount" как var goldCount: Int = 0 ниже вашего IBOutlet s.

Также для дальнейшей оптимизации вы можете извлечь строка "goldCount", используемая как let goldCountKey: String = "goldCount" и используемая как defaults.set(0, forKey: goldCountKey). По моему мнению, избегать жестко запрограммированных строк - хорошая практика, но в данном случае это не так важно.

Чтобы сохранить новое значение при каждом нажатии, добавьте UserDefaults.standard.set(goldCount, forKey: goldCountKey) в getGoldClicked. Другая идея заключается в том, чтобы добавить это в функцию AppDelegate willTerminate, чтобы убедиться, что вы сохраните свое значение после завершения работы приложения. Хотя для этого потребуются ссылки на значение goldCount, так что нет ru sh.

Надеюсь, это поможет!

2 голосов
/ 29 января 2020

Попробуйте ниже

class ViewController: UIViewController {

    @IBOutlet weak var numberOfGold: UILabel!
    @IBOutlet weak var highScore: UILabel!

    //declare your count variable globally
    var goldCount : Int = 0
    let defaults = UserDefaults.standard

    override func viewDidLoad() {
        super.viewDidLoad()
        //get the highscore and then set it to label
        let userHighScore = getUserScore()
        highScore.text = "\(userHighScore)"

    }

    @IBAction func goldButtonClicked(_ sender: Any) {
        goldCount += 1
        numberOfGold.text = "\(goldCount)"
    }

    //function to say game finished and store the score in userdefault
    //call this function when the gameHasFinished
    func gameFinished() {
        saveUserScore(goldCount)
    }

    func saveUserScore(_ score:Int){
        defaults.set(score, forKey: "goldCount")
    }
    func getUserScore()-> Int {
        return  defaults.integer(forKey: "goldCount")
    }
}
2 голосов
/ 29 января 2020
import UIKit

class CookieClickerVC: UIViewController {

@IBOutlet weak var goldLabel: UILabel!
@IBOutlet weak var numberOfGold: UILabel!
@IBOutlet weak var getGoldButton: UIButton!

private var goldCount: Int = Int()

override func viewDidLoad() {
    super.viewDidLoad()
    formatItems()

}



@IBAction func getGoldClicked(_ sender: Any) {
    goldCount += 1

    numberOfGold.text = ("\(goldCount)")

    UserDefaults.standard.set(goldCount, forKey: "goldCount")

    UserDefaults.standard.synchronize()

   //To get the count again you can use

     print(UserDefaults.standard.integer(forKey: "goldCount")
}

Всякий раз, когда есть увеличение, вы можете сохранить значение goldCount, как это в вашем UserDefault, и я также добавил, как вы можете получить то же значение из UserDefault.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...