2017-09-24 5 views
0

j'ai une application où je me temps et voir combien de temps il me faut pour terminer un tas de questions. J'ai le temps transféré à un autre VC et affiché dans une étiquette. Je l'ai stocké en appuyant sur un bouton mais quand j'ai une nouvelle variable (temps) il le remplace. Comment stocker un tableau de valeurs et qui peut être affiché dans une étiquette?remplaçant l'autre en utilisant UserDefaults

bouton pour enregistrer la valeur:

@IBAction func saveScore(_ sender: Any) { 
    scoreLabel.text = label.text 
    UserDefaults.standard.set(scoreLabel.text, forKey: "score") 
} 

Le code qui contient en permanence les données:

override func viewDidAppear(_ animated: Bool) { 
    if let x = UserDefaults.standard.object(forKey: "score") as? String { 
     scoreLabel.text = x 
    } 
} 

Mon scoreLabel affiche tous mes scores et étiquette indique le temps que vous venez de recevoir.

Répondre

0

Utilisez les extentions suivantes sur UserDefaults pour stocker un tableau de fois:

extension UserDefaults { 
    var times: [String] { 
     get { 
      if let times = UserDefaults.standard.object(forKey: "times") as? [String] { 
       return times 
      } else { 
       return [] 
      } 
     } 
     set { 
      UserDefaults.standard.set(newValue, forKey: "times") 
     } 
    } 
} 

Alors que vous n'avez pas besoin d'étendre UserDefaults, en utilisant l'extension peut simplifier un peu de travail avec des valeurs persistantes et il rend le code plus propre .

Ensuite, au point où vous montrer les données, utilisez la ligne suivante pour accéder au tableau:

let arrayOfTimes = UserDefaults.standard.times 
scoreLabel.text = "\(arrayOfTimes)" // or any other formatting you'd like 

Et au lieu de régler les temps de persister une nouvelle partition, il suffit d'ajouter le nouveau score au tableau , par exemple:

// This will not only add the scoreLabel.text to the array, but also persists it 
UserDefaults.standard.times.append(scoreLabel.text) 
+0

Merci Milan pour l'aide, il est très apprécié! Quand je finis le jeu, il affiche "Label" au lieu de ce que l'étiquette dit par exemple 23.5 secondes, tout le reste est correct sauf que –

+1

ce n'est pas le problème des UserDefaults .. très probablement c'est le problème quand vous définissez le texte de l'étiquette (et lorsque vous enregistrez les données dans UserDefaults). passez en revue votre code et essayez d'enregistrer les données dans les UserDefaults dès qu'elles sont disponibles, et actualisez l'étiquette à partir des UserDefaults dès que possible, lorsque l'étiquette est présentée. En fin de compte, vous n'avez même pas à le passer entre viewControllers, il suffit d'ajouter les valeurs à la fin, et dans le viewController avec le label utiliser les données de UserDefaults –

+0

Ok merci, je vais vous dire comment je vais merci pour tout! –

0

Swift 4,

pour enregistrer un tableau à l'utilisateur Defaul ts vous faire:

let defaults = UserDefaults.standard 

let array = [25, 50] 

defaults.set(array, forKey: "Scores") 

Et pour accéder au tableau de valeurs par défaut de l'utilisateur:

let defaults = UserDefaults.standard 

let retrievedArray = defaults.array(forKey: "Scores") as? [Int] ?? [] 

Et si vous deviez afficher un score de votre tableau dans une étiquette puis, vous simplement ne:

scoreLabel.text = String(describing: retrievedArray[0]) 

Si vous utilisez des entiers pour votre système de notation, je suggère vous stocker vos scores comme Int dans les paramètres par défaut de l'utilisateur.

Si vous préférez utiliser Strings cependant, s'il vous plaît noter que vous pouvez utiliser la méthode de stringArray(forKey:) par défaut de l'utilisateur directement, au lieu de la méthode array(forKey:), et donc, dans ce cas, vous auriez pas besoin de taper jeté votre tableau :

let someStringArray = defaults.stringArray(forKey: "ArrayOfStrings") 

note: pour répondre à votre question, je considérerai que vous utilisez des scores Int, mais ne hésitez pas à utiliser celui que vous préférez.

Si vous souhaitez enregistrer votre tableau à la même clé dans les paramètres par défaut de l'utilisateur chaque fois que vous obtenez une nouvelle partition, vous pouvez le faire facilement comme ceci:

let defaults = UserDefaults.standard 

// Your new score: 

let newScore = 75 

// Get your current scores list from User Defaults: 

var currentArray = defaults.array(forKey: "Scores") as? [Int] ?? [] 

// Append your new score to the current array:    

let updatedArray = currentArray.append(newScore) 

// And save your updated array to User Defaults: 

defaults.set(updatedArray, forKey: "Scores") 

// In this example, your User Defaults now contains the updated array [25, 50, 75] 

et qu'il est:).

S'il vous plaît noter qu'il n'y a pas besoin d'utiliser une extension pour que ..

MISE À JOUR: Aussi, si vous voulez ajouter quelque chose à l'intérieur de votre méthode viewDidAppear, ne pas oublier d'ajouter super.viewDidAppear(animated). La même chose vaut pour viewDidLoad, etc.

Les documentation états:

Vous pouvez remplacer cette méthode pour effectuer des tâches supplémentaires associées de présenter le point de vue. Si vous remplacez cette méthode, vous devez appeler super à un certain moment dans votre implémentation.

Vous auriez:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    if let retrievedArray = defaults.array(forKey: "Scores") as? [Int] { 

     print(retrievedArray) 

     // You can access your scores array safely here 
    } 
} 
+0

Je ne suis pas sûr de l'endroit où je devrais mettre ce code. Quels codes dois-je avoir pour mon bouton de sauvegarde et mon code userDefaults dans viewDidAppear. J'ai mis le code là où je pense, mais ça ne fonctionne pas pour le moment. D'ailleurs, j'utilise des chaînes mais devrais-je utiliser Integers. Merci pour l'instant! –

+0

Si votre score représente un nombre entier dans votre application, alors vous feriez mieux de l'enregistrer comme un Int, en effet, cela aurait plus de sens. Bien sûr, vous pouvez toujours montrer votre score dans une étiquette comme je l'ai montré dans ma réponse, en utilisant String (décrivant :). – Alex

+0

Eh bien, vous devriez placer ce code à l'intérieur de votre @IBAction (sauvegarder le score), parce que vous voulez sauvegarder votre nouveau score dans les valeurs par défaut de l'utilisateur chaque fois que l'utilisateur tape sur le bouton de sauvegarde. :) – Alex