ios - (Swift) Almacenar y recuperar Array en NSUserDefaults
tableview (7)
¿Qué estás almacenando en la matriz?
Si son objetos, no funcionará, si son solo cadenas o números, entonces debería estar bien.
Los siguientes pasos que debe seguir deben ser activar puntos de interrupción de excepción y quizás imprimir todo () todo lo que pueda para que pueda determinar el paradero exacto del problema.
Como una toma en la oscuridad, sugeriría que tal vez (identity.text!) Salga como nulo
También probablemente deberías cambiarlo a esto
if let tabledata: NSArray = NSUserDefaults.standardUserDefaults().stringForKey("/(identity.text!)listA"){
myArray = [tabledata!]
tableView.reloadData()
}
Esto hará que el código ni siquiera intente ejecutarse a menos que haya un valor que pueda usar
Estoy tratando de almacenar una matriz en
NSUserDefaults
y recuperar la matriz cuando sea necesario para completar un
UITableView
.
Actualmente estoy 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()
Pero consigo
error fatal: inesperadamente encontrado
nil
al desenvolver un valor opcional
al intentar cargar los datos. No estoy seguro de si el problema está en el almacenamiento o la recuperación. ¿Alguien ha pasado por esto antes?
De su código, veo que está almacenando una matriz
// Your code
NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "/(identity.text!)listA")
y recuperar una cadena
//Your code
let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("/(identity.text!)listA")
Probablemente hay una falta de coincidencia de tipo. Usted almacena un tipo y recupera otro tipo.
Mientras recupera, use
arrayForKey()
u
objectForKey()
vea el código a continuación.
let tabledata = NSUserDefaults.standardUserDefaults().arrayForKey("/(identity.text!)listA")
o
let tabledata = NSUserDefaults.standardUserDefaults().objectForKey("/(identity.text!)listA")
Si es una matriz, iría con la primera.
Esta es la forma en que puede almacenar y recuperar una matriz de objetos con la ayuda de
NSKeyArchive
.
Para almacenar la matriz en NSUserDefault.
let array = ["horse", "cow", "camel", "sheep", "goat"]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")
A la matriz recuperada de NSUserDefault.
let defaults = UserDefaults.standard
let array = defaults.object(forKey: "SavedStringArray") as? [String] ?? [String]()
Espero que esto te ayude.
Esto se ha cambiado en Swift 3. Tenga en cuenta que esto funciona con el dispositivo pero no con el patio de juegos o el simulador
//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)
}
Llegué a esta pregunta buscando cómo guardar una matriz de cadenas en UserDefaults pero no encontré una respuesta clara aquí. Sin embargo, encontré la respuesta en Cómo guardar la configuración del usuario usando NSUserDefaults . Lea ese artículo para más información.
Guardar y recuperar una matriz de cadenas en UserDefaults
Guardar matriz
let placesData = NSKeyedArchiver.archivedData(withRootObject: placesArray)
UserDefaults.standard.set(placesData, forKey: "places")
Recuperar matriz
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)
}
Almacenar en el valor predeterminado del usuario:
let arrayFruit = ["Apple","Banana","Orange","Grapes","Watermelon"]
//store in user default
UserDefaults.standard.set(arrayFruit, forKey: "arrayFruit")
Recuperando la matriz de los valores predeterminados del usuario:
if let arr = UserDefaults.standard.array(forKey: "arrayFruit") as? [String]{
print(arr)
}
La última versión de swift3 para almacenar una matriz de datos en los valores predeterminados del usuario y obtener esa matriz de datos usando claves
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 )
}