(Swift) Storing and retrieving Array to NSUserDefaults
Solution 1
From your code I see you are storing some array
// Your code
NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "\(identity.text!)listA")
and retrieving a string
//Your code
let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA")
There is probably a type mismatch, You store one type and retrieve another type.
While retrieving either use arrayForKey()
or objectForKey()
see the code below.
let tabledata = NSUserDefaults.standardUserDefaults().arrayForKey("\(identity.text!)listA")
or
let tabledata = NSUserDefaults.standardUserDefaults().objectForKey("\(identity.text!)listA")
If it is an array I would go with First one.
Solution 2
Here are the way that you can store and retrieved array of object with help of NSKeyArchive
.
To Store array to NSUserDefault.
let placesData = NSKeyedArchiver.archivedData(withRootObject: placesArray)
UserDefaults.standard.set(placesData, forKey: "places")
To Retrieved array from 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)
}
Hope this help you.
Solution 3
Saving and Retrieving a String array to UserDefaults
Save array
let array = ["horse", "cow", "camel", "sheep", "goat"]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")
Retrieve array
let defaults = UserDefaults.standard
let array = defaults.object(forKey: "SavedStringArray") as? [String] ?? [String]()
See more at How to save user settings using NSUserDefaults
Solution 4
What are you storing in the array?
If it's objects it won't work, if It's just strings or numbers then it should be fine.
Next steps you take should be to turn on exception breakpoints and maybe println() everything you can so you can pinpoint the exact whereabouts of the problem.
As a shot in the dark I would suggest maybe (identity.text!) is coming out as nil
Also you should probably change it to this
if let tabledata: NSArray = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA"){
myArray = [tabledata!]
tableView.reloadData()
}
This will make the code not even try to run unless there is a value it can use
Solution 5
Latest swift3 version to store array of data into userdefaults and get that array of data using keys
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 )
}
Related videos on Youtube
William Larson
Updated on December 18, 2020Comments
-
William Larson over 3 years
I am trying to store an array to
NSUserDefaults
and retrieve the array when needed to populate aUITableView
.Currently I am using:
//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()
But I get
fatal error: unexpectedly found
nil
while unwrapping an Optional valuewhen trying to load the data. I am not sure if the issue is in the storage or the retrieval. Has anyone been through this before?
-
William Larson about 9 yearsI printed identity.text! and that is working properly. So the issue is not there. I tried running your code but I still get the same error.
-
William Larson about 9 yearsprintln("(tabledata)') is what is returning nil
-
kalpa over 6 yearsFor custom object array it's not working can you please help me out. let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: customeobject array)
-
Mr.Javed Multani over 6 yearsYa ill take care of it. Thanks @Moritz