2017-05-08 2 views
3

J'utilise UserDefaults pour enregistrer une petite valeur à laquelle il faut parfois écrire. Je crois que je l'ai configuré correctement, mais je ne sais pas pourquoi cela ne fonctionne pas après que j'ai quitté le simulateur et que je l'ai redémarré. La mise en place:La valeur de défaut d'utilisateur ne persiste pas malgré la synchronisation?

let defaults = UserDefaults.standard 

Il est ensuite écrit/modifié comme suit:

defaults.set(true, forKey: "defaultsChecker") 
defaults.synchronize() 

Utilisation d'une instruction d'impression que je peux voir que la valeur est en effet mis à jour d'être nul à être vrai. Cependant, la vérification de la valeur dans un viewDidLoad au début de tourner le simulateur à nouveau (après avoir été quit) comme suit:

print("The value is is \((defaults.value(forKey: "defaultsChecker") as! Bool)))") 

Cela renvoie toujours nul au début, ce qui signifie qu'il ne doit pas être sauvé/persistent dans la fermeture et la réouverture du simulateur. Je ne sais pas pourquoi c'est le cas.

+0

Etes-vous sûr pas où dans le code que vous réinitialisez la valeur pour « defaultsChecker » clé? – Priyal

+1

En supposant que vous avez vérifié l'orthographe de la clé ("defaultsChecker"), vous devez rechercher "defaultsChecker" dans le projet entier pour vous assurer qu'il n'est pas défini sur "false" n'importe où. BTW, je vous suggère de déclarer une constante avec la valeur de « defaultsChecker » et l'utiliser comme une clé pour éviter l'erreur de frappe mal quand vous avez besoin de l'utiliser ... –

+7

Ne pas utiliser 'valeur (forKey :) 'lire une valeur de' UserDefaults' à moins que vous n'ayez un besoin clair d'utiliser le codage de valeur-clé. Vous définissez un 'Bool' donc lisez un' Bool' en utilisant 'bool (forKey:)'. – rmaddy

Répondre

2

ne pas utiliser value(forKey:) pour lire Bool Valeur de UserDefaults vous lorsque vous définissez bool puis utilisez bool(forKey:)

let defaults = UserDefaults.standard 
defaults.set(true, forKey: "defaultsChecker") 
print("The value is is \(defaults.bool(forKey: "defaultsChecker"))") 

ici montré plusieurs types de valeur dans UserDefaults

enter image description here

et vous voulez obtenir des valeurs, puis essayez ceci

defaults.integer(forKey:) 
defaults.string(forKey:) 
defaults.double(forKey:) 
defaults.array(forKey:) 
defaults.dictionary(forKey:) 
defaults.data(forKey:) 
defaults.bool(forKey:) 

et il n'est pas nécessaire d'utiliser synchronize() ils se synchronisent automatiquement.

dans votre question vous essayez ceci ...

if let defaultsChecker = UserDefaults.standard.object(forKey: "defaultsChecker") as? Bool { 
     if defaultsChecker { 
      debugPrint(defaultsChecker)// value has True 
     } else { 
      debugPrint(false)// value has False 
     } 
    } 
+0

Je peux passer à '.bool (forKey:)' mais le problème est que je dois d'abord vérifier s'il a été écrit du tout, donc je dois vérifier avec une instruction if: 'if defaults.value (forKey: "defaultsChecker")! = nil {} 'mais je ne peux pas vérifier si elle n'est pas égale à zéro si j'utilise' .bool' au lieu de '.value'. Comment puis-je contourner cela? –

+0

@AlekPiasecki Vérifier que je mets à jour ma réponse – ItsMeMihir