таблица лидеров с постоянными данными в быстром использовании userdefault для сохранения значений - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь создать таблицу лидеров, но имена и результаты игроков не сохраняются постоянно, «таблица лидеров» содержит только данные из самой последней игры в текстовом виде. Я попытался заставить arrayOfData изначально содержать playerName и finalScore вместо пустого массива, но проблема все еще остается. Как я могу постоянно отображать playerName и playerScore в таблице лидеров и добавлять больше имен и очков по мере того, как все больше людей играют?

var finalScore = Int()
var playerName = String()
var allMyStoredData = UserDefaults.standard
var arrayOfData: [Any] = []
class secondVC: UIViewController {

@IBOutlet weak var scoreLabel: UILabel!
@IBOutlet weak var nameTF: UITextField!
@IBOutlet weak var doneButton: UIButton!
var playerScore = 0
var arrayOfData: [Any] = []
    override func viewDidLoad() {
    super.viewDidLoad()
        scoreLabel.text = "Your score is: \(finalScore)"
        loadData()
}

@IBAction func donePressed(_ sender: Any) {
    saveData()
    performSegue(withIdentifier: "toLeaderboard", sender: self)
}

func saveData () {
    playerName = nameTF.text!
    playerScore = finalScore
    arrayOfData.append(playerName)
    arrayOfData.append(playerScore)
    allMyStoredData.set(playerName, forKey: "saveTheName")
    allMyStoredData.set(playerScore, forKey: "saveTheScore")
    allMyStoredData.set(arrayOfData, forKey: "saveTheArray")


}

func loadData () {
    if let loadPlayerName:String = UserDefaults.standard.value(forKey: "saveTheName") as? String {
        playerName = loadPlayerName
    }

    if let loadTheScore:Int = UserDefaults.standard.value(forKey: "saveTheName") as? Int {
        playerScore = loadTheScore
    }
}

}

// это код в контроллере списка лидеров

class leaderboardViewController: UIViewController {

    @IBOutlet weak var theTextView: UITextView!
    override func viewDidLoad() {
        super.viewDidLoad()
        theTextView.text = "\((arrayOfData).map{"\($0)"}.joined(separator: "          Score: "))"
    }

}

1 Ответ

0 голосов
/ 15 марта 2019

Вы каждый раз перезаписываете свой saveTheArray элемент UserDefaults новым массивом.

Сначала вы хотите получить сохраненный массив, добавить новые игровые данные, а затем снова сохранить как:

//Create user defaults instance
let userDefaults = UserDefaults.standard

//User defaults key
let historicalGameDataKey = "historicalGameData"

//Fetch game data array
var historicalGameData = userDefaults.array(forKey: historicalGameDataKey)

//Create array if it is nil (i.e. very first game)
if historicalGameData == nil {
    historicalGameData = []
}

//Create game data dictionary
let gameData = [
    "playerName": playerName,
    "playerScore": playerScore
]

//Append game data dictionary to the array
historicalGameData?.append(["playerName": gameData])

//Save the updated array
userDefaults.set(historicalGameData, forKey: historicalGameDataKey

Базовые данные были бы лучшим способом хранения этих данных, но этот пример должен решить вашу проблему с помощью UserDefaults.

...