web-dev-qa-db-fra.com

Supprimer les valeurs de clé pour NSUserDefaults dans Swift

Comment supprimer des données de NSUserDefaults? Il y a pas mal de réponses sur la manière de le faire dans l'Objectif C, mais qu'en est-il de Swift? J'ai donc essayé ceci:

let defaults = NSUserDefaults.standardUserDefaults()
    defaults.removeObjectForKey("myKey")

N'a pas fonctionné Peut-être que ce que je veux vraiment supprimer n'est pas NSUserDefaults? Voici comment je sauvegarde des données:

class MySavedData: NSObject, NSCoding {
    var image: String

    init(name: String, image: String) {
        self.image = image
    }

    required init(coder aDecoder: NSCoder) {
        image = aDecoder.decodeObjectForKey("image") as! String
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(image, forKey: "image")
    }
}

class ViewController: <...> {
    var myData = [MySavedData]() //Later myData gets modified and then function save() is called

    func save() {
        let savedData = NSKeyedArchiver.archivedDataWithRootObject(myData)
        let defaults = NSUserDefaults.standardUserDefaults()
        defaults.setObject(savedData, forKey: "myKey")
    }
}

EDIT: Juste pour effacer certaines choses - les données en cours de sauvegarde sont petites (même pas près de 100 Ko)

Et peut-être que je ne sauvegarde pas de données dans NSUserDefaults (je suis novice en programmation), voici comment je l'obtiens (chargement):

let defaults = NSUserDefaults.standardUserDefaults()
if let savedData = defaults.objectForKey("myData") as? NSData {
    myData = NSKeyedUnarchiver.unarchiveObjectWithData(savedData) as! [UserLogin]
    }
26
Xernox

removeObjectForKey est la bonne voie à suivre.
Cela supprimera la valeur pour la clé sélectionnée. Le code suivant définit une valeur de chaîne pour une clé dans NSUserDefaults, l'imprime puis utilise removeObjectForKey pour supprimer et imprimer à nouveau la valeur de clé. Après removeObjectForKey, la valeur est nil.

let prefs = NSUserDefaults.standardUserDefaults()
var keyValue = prefs.stringForKey("TESTKEY")
print("Key Value not set \(keyValue)")
let strHello = "HELLO WORLD"

prefs.setObject(strHello, forKey: "TESTKEY")
keyValue = prefs.stringForKey("TESTKEY")
print("Key Value \(keyValue)")

prefs.removeObjectForKey("TESTKEY")
keyValue = prefs.stringForKey("TESTKEY")
print("Key Value after remove \(keyValue)")

Résultats:

Valeur de la clé non définie à zéro

Clé Valeur Facultatif ("HELLO WORLD")

Valeur clé après suppression de zéro

Mettre à jour Swift 3:

let prefs = UserDefaults.standard
keyValue = prefs.string(forKey:"TESTKEY")
prefs.removeObject(forKey:"TESTKEY")
59
greentor

Le code que vous avez écrit fonctionnera correctement, mais NSUserDefaults se synchronise à un certain intervalle de temps. 

Comme vous le souhaitez, cela devrait se refléter immédiatement dans NSUserDefaults. Vous devez donc écrire synchroniser  

let defaults = NSUserDefaults.standardUserDefaults()
defaults.removeObjectForKey("myKey") 
defaults.synchronize()
12
sourav

Essaye ça

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)

pour Swift 3

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)

Mais cela effacera toutes les valeurs de NSUserDefaults.careful lors de l'utilisation.

6
Avijit Nagare

Je voudrais une solution qui définissant la valeur à nil pour un clé.

Swift 3

UserDefaults.standard.set(nil, forKey: "key")

Swift 2.x

NSUserDefaults.standardUserDefaults().setValue(nil, forKey: "key")

NOTE: C’est une déclaration claire et simple, mais gardez à l’esprit qu’il existe une limite à stocker des informations dans NSUserDefaults, c’est certainement pas le bon endroit pour stocker de gros fichiers binaires (comme par exemple des images) - pour cela il existe un dossier Documents. Cependant, la taille du var image: String que vous encodez/décodez n'est pas définie.

4
holex

Utilisez ce qui suit pour la boucle:

for key in NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys {
   NSUserDefaults.standardUserDefaults().removeObjectForKey(key.description)
}
2
Gaurav Gudaliya

Suppression de UserDefaults pour la clé dans Swift 3, en fonction de la réponse principale, une syntaxe légèrement différente:

UserDefaults.standard.removeObject(forKey: "doesContractExist")
1
Daniel Jones

Swift 4.x Supprimer toutes les clés dans UserDefaults  

let defaults = UserDefaults.standard
let dictionary = defaults.dictionaryRepresentation()

    dictionary.keys.forEach 
    { key in   defaults.removeObject(forKey: key)
    }
1
Kandhal Bhutiya

Pour supprimer toutes les clés UserDefaults, vous pouvez utiliser le code suivant dans Swift 3.x:

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
0
Adrian
func  remove_pref(remove_key : String){
    UserDefaults.standard.removeObject(forKey: remove_key)
    UserDefaults.standard.synchronize()
}
0
Softlabsindia

Code de mise à jour pour Swift: Utilisé sous la ligne de code pour supprimer les valeurs de clé pour NSUserDefaults dans Swift

UserDefaults.standard.setValue(nil, forKey: "YouEnterKey")
0
Kiran jadhav