2015-05-08 16 views
14

Sto tentando di memorizzare un array su NSUserDefaults e recuperare l'array quando necessario per popolare uno UITableView.(Swift) Memorizzazione e richiamo dell'array su NSUserDefaults

Attualmente sto usando:

//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() 

Ma ho

fatal error: unexpectedly found nil while unwrapping an Optional value

quando si cerca di caricare i dati. Non sono sicuro che il problema riguardi la memorizzazione o il recupero. Qualcuno l'ha già fatto prima?

risposta

26

dal codice vedo che archiviano alcune serie

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

e il recupero di una stringa

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

C'è probabilmente un tipo non corrispondente, di memorizzare un tipo e recuperare un altro tipo.

Durante il recupero utilizzare arrayForKey() o objectForKey() vedere il codice di seguito.

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

o

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

Se si tratta di un array vorrei andare con primo.

3

Cosa stai memorizzando nell'array?

Se sono oggetti non funzionerà, se sono solo stringhe o numeri, allora dovrebbe andare bene.

I passi successivi da intraprendere dovrebbero essere quelli di attivare i punti di interruzione delle eccezioni e forse println() tutto ciò che è possibile in modo da poter individuare l'esatta ubicazione del problema.

Come un salto nel buio vorrei suggerire forse (identity.text!) È venuta fuori come nullo

Inoltre, probabilmente si dovrebbe cambiare a questo

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

    myArray = [tabledata!] 

    tableView.reloadData() 
} 

Questo renderà il codice non anche provare a correre a meno che non v'è un valore che può utilizzare

+0

identity.text ho stampato! e funziona correttamente. Quindi il problema non c'è. Ho provato a eseguire il codice ma ottengo ancora lo stesso errore. –

+0

println ("\ (tabledata) ') è ciò che ritorna nil –

8

Ecco come è possibile archiviare e recuperare la matrice di oggetti con l'aiuto di NSKeyArchive.

Per memorizzare array su NSUserDefault.

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

Per matrice Estratto da 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) 
} 

Spero che questo aiuto.

5

Sono giunto a questa domanda cercando come salvare un array di String in UserDefaults ma non ho trovato una risposta chiara qui. Tuttavia, ho trovato la risposta in How to save user settings using NSUserDefaults.Leggi questo articolo per maggiori informazioni.

Salvataggio e recupero di una matrice di stringhe UserDefaults

Salva serie

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

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

Recupera serie

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

Questo è stato modificato in rapida 3. Nota che questo funziona con il dispositivo, ma non parco giochi o simulatore

//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) 
} 
2

Ultima versione swift3 per memorizzare array di dati in userdefaults e ottenere che array di dati usando le chiavi

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) 
} 
Problemi correlati