Maintenant que vous savez tout sur les UserDefaults, on va jouer un peu avec ! Dans ce chapitre, on va sauvegarder la monnaie sélectionnée par l'utilisateur dans les UserDefaults, et ensuite la récupérer pour l'afficher.
Créez une instance de UserDefaults
La sauvegarde va avoir lieu dès qu'on modifie la monnaie. Cela a lieu dans SettingsViewController
avec la méthode changeCurrency
:
@IBAction func changeCurrency(_ sender: UIButton) {
guard let currency = sender.titleLabel?.text else { return }
currencyLabel.text = currency
// TODO: Save currency
}
Et comme vous pouvez le voir, cette méthode est incomplète. Ce ne sera plus le cas dans quelques minutes !
UserDefaults est une classe : UserDefaults
. Pour l'utiliser, il nous faut une instance. Vous pouvez créer une instance de UserDefaults
, mais, en pratique, vous utiliserez presque toujours standard
: une propriété statique de UserDefaults
de type UserDefaults
. Donc toutes vos manipulations de UserDefaults vont commencer comme ceci :
UserDefaults.standard
Sauvegardez des données
Maintenant qu'on a une instance, on va pouvoir utiliser les méthodes que nous avons vues ensemble dans le chapitre précédent. Pour sauvegarder notre monnaie, nous allons utiliser la méthode set(Any?, forKey: String)
comme ceci :
UserDefaults.standard.set(currency, forKey: "currency")
Je sauvegarde mon objet currency
avec la clé currency. J'utiliserai cette clé ensuite pour récupérer mon objet.
Voilà ce que donne le code complet de notre méthode changeCurrency
:
@IBAction func changeCurrency(_ sender: UIButton) {
guard let currency = sender.titleLabel?.text else { return }
currencyLabel.text = currency
UserDefaults.standard.set(currency, forKey: "currency")
}
Récupérez un objet
Nous avons sauvegardé la monnaie préférée de notre utilisateur ! Mais pour l'instant, on n'en fait rien. Nous allons récupérer cette information pour l'afficher à deux endroits :
Dans le label de l'interface de
SettingsViewController
, pour que lorsque cette interface apparaît, elle affiche directement la monnaie sélectionnée.Dans la liste des dépenses
(ListViewController)
, pour que le montant de chaque dépense s'affiche dans la bonne monnaie.
SettingsViewController
On va récupérer la monnaie depuis les UserDefaults au chargement de la vue, donc dans la méthode viewDidLoad
. Pour cela, on va utiliser la méthode dont on a parlé au chapitre précédent, object(forKey: String) -> Any?
:
override func viewDidLoad() {
super.viewDidLoad()
let currency = UserDefaults.standard.object(forKey: "currency") as? String
currencyLabel.text = currency
}
Je récupère mon objet en utilisant ma clé currency définie précédemment. Comme la méthode object(forKey:)
renvoie un type Any?
, je contrôle son type pour m'assurer qu'il s'agit bien d'une String
.
Ensuite, je mets à jour mon label avec la monnaie récupérée.
ListViewController
On va faire la même chose dans notre liste de dépenses en mettant à jour la méthode suivante :
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "SpendingCell", for: indexPath)
let spending = SpendingService.shared.spendings[indexPath.row]
cell.textLabel?.text = spending.content
cell.detailTextLabel?.text = "\(spending.amount) €" // Ici, on va changer la monnaie.
return cell
}
Cette fois-ci, on va utiliser une des variantes de object(forkey:)
: string(forkey:)
. Cette version fonctionne exactement de la même manière, mais a l'avantage de renvoyer directement un objet de type String?
. Cela nous évite de faire le contrôle de type.
Voilà ce que ça donne :
let currency = UserDefaults.standard.string(forKey: "currency") ?? "€"
cell.detailTextLabel?.text = "\(spending.amount) \(currency)"
Et voilà ! Vous pouvez tester ! Désormais, la monnaie choisie par l'utilisateur est présente partout dans l'application.
En résumé
On utilise la plupart du temps l'instance
standard
de la classeUserDefaults
.Il existe plusieurs variantes de
object(forKey:)
qui permettent d'éviter le contrôle de type.
Dans le prochain chapitre, nous allons refactoriser notre code parce que, je ne sais pas pour vous, mais moi il y a un ou deux trucs qui me brûlent les yeux !