web-dev-qa-db-fra.com

(Swift) Stockage et récupération de la baie dans NSUserDefaults

J'essaie de stocker un tableau dans NSUserDefaults et de récupérer le tableau lorsque cela est nécessaire pour remplir un UITableView.

Actuellement j'utilise:

//store data
NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "\(identity.text!)listA")                    
NSUserDefaults.standardUserDefaults().synchronize()

//retrieve data
let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA")
myArray = [tabledata!]
tableView.reloadData()

Mais je reçois

erreur fatale: découverte inattendue de nil lors du déballage d'une valeur facultative

lorsque vous essayez de charger les données. Je ne sais pas si le problème est dans le stockage ou la récupération. Quelqu'un a-t-il déjà vécu cela?

18
William Larson

D'après votre code, je vois que vous stockez un tableau

// Your code
NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "\(identity.text!)listA")

et récupérer une chaîne

//Your code
let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA")

Il y a probablement une incompatibilité de type. Vous stockez un type et récupérez un autre type.

Lors de la récupération, utilisez arrayForKey() ou objectForKey() voir le code ci-dessous.

let tabledata = NSUserDefaults.standardUserDefaults().arrayForKey("\(identity.text!)listA") 

ou

let tabledata = NSUserDefaults.standardUserDefaults().objectForKey("\(identity.text!)listA")

S'il s'agit d'un tableau, j'irais avec le premier.

31
Vivek Molkar

Je suis venu à cette question en cherchant comment enregistrer un tableau de chaînes dans UserDefaults mais je n'ai pas trouvé de réponse claire ici. Cependant, j'ai trouvé la réponse dans Comment enregistrer les paramètres utilisateur à l'aide de NSUserDefaults . Lisez cet article pour plus d'informations.

Enregistrement et récupération d'un tableau de chaînes dans UserDefaults

Enregistrer le tableau

let array = ["horse", "cow", "camel", "sheep", "goat"]

let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")

Récupérer le tableau

let defaults = UserDefaults.standard
let array = defaults.object(forKey: "SavedStringArray") as? [String] ?? [String]()
10
Suragch

Voici la façon dont vous pouvez stocker et récupérer un tableau d'objets à l'aide de NSKeyArchive.

Pour stocker le tableau dans NSUserDefault.

let placesData = NSKeyedArchiver.archivedData(withRootObject: placesArray)
UserDefaults.standard.set(placesData, forKey: "places")

vers le tableau récupéré de NSUserDefault.

let placesData = UserDefaults.standard.object(forKey: "places") as? NSData

if let placesData = placesData {
    let placesArray = NSKeyedUnarchiver.unarchiveObject(with: placesData as Data) as? [Place]
    print(placesArray)
}

J'espère que cela vous aidera.

10

Que stockez-vous dans le tableau?

Si ce sont des objets, cela ne fonctionnera pas, si ce ne sont que des chaînes ou des nombres, alors ça devrait aller.

Les étapes suivantes doivent être d'activer les points d'arrêt d'exception et peut-être println () tout ce que vous pouvez afin que vous puissiez localiser exactement le problème.

En tant que cliché dans le noir, je dirais peut-être que (identity.text!) Sort comme nul

Vous devriez aussi probablement le changer en

if let tabledata: NSArray = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA"){

    myArray = [tabledata!]

    tableView.reloadData()
}

Cela empêchera même le code de s'exécuter, sauf s'il existe une valeur qu'il peut utiliser

3
RyanOfCourse

dernière version de Swift3 pour stocker un tableau de données dans les paramètres utilisateur et obtenir ce tableau de données à l'aide de clés

    let nameArray = ["Ramu","JAGAN","Steve","Swift"]
    let namesArrayData = NSKeyedArchiver.archivedData(withRootObject: nameArray)
    UserDefaults.standard.set(namesArrayData, forKey: "arrayData")

RetriveData

        let retriveArrayData= UserDefaults.standard.object(forKey:  "arrayData") as? NSData

   if let retriveArrayData= namesArrayData{
  let retriveArray = NSKeyedUnarchiver.unarchiveObject(with: namesArraydata as Data) as? [nameArray]
  print(retriveArray )
}
2

Cela a été changé dans Swift 3. Notez que cela fonctionne avec l'appareil mais pas le terrain de jeu ou le simulateur

//store the array
let array = ["horse", "cow", "camel", "sheep", "goat"]

let defaults = UserDefaults.standard

defaults.setValue(array, forKey: "history")

defaults.synchronize()

//Retrieve the array
if((UserDefaults.standard.array(forKey: "history")) != nil){
    let historyWords = (UserDefaults.standard.array(forKey: "history") as? [String])!
    print(historyWords)
}
1
flame3