我正在尝试将数组存储到NSUserDefaults
,并在需要填充UITableView
时检索数组。
目前我正在使用:
//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()
但是我得到了
致命错误:在展开Optional时意外发现
nil
值
尝试加载数据时。我不确定问题是存储还是检索。有没有人经历过这个?
答案 0 :(得分:31)
从你的代码我看到你正在存储一些数组
// Your code
NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "\(identity.text!)listA")
并检索字符串
//Your code
let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA")
可能存在类型不匹配,您存储一种类型并检索另一种类型。
在检索时使用arrayForKey()
或objectForKey()
,请参阅下面的代码。
let tabledata = NSUserDefaults.standardUserDefaults().arrayForKey("\(identity.text!)listA")
或
let tabledata = NSUserDefaults.standardUserDefaults().objectForKey("\(identity.text!)listA")
如果是阵列,我会选择第一个。
答案 1 :(得分:9)
Here are the way that you can store and retrieved array of object with help of DeviceDataMapper
.
To Store array to NSUserDefault.
deviceService
To Retrieved array from NSUserDefault.
NSKeyArchive
Hope this help you.
答案 2 :(得分:9)
我遇到了这个问题,看看如何将一个String数组保存到UserDefaults,但在这里找不到明确的答案。但是,我确实在How to save user settings using NSUserDefaults中找到了答案。阅读该文章了解更多信息。
保存数组
let array = ["horse", "cow", "camel", "sheep", "goat"]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")
检索数组
let defaults = UserDefaults.standard
let array = defaults.object(forKey: "SavedStringArray") as? [String] ?? [String]()
答案 3 :(得分:3)
你在数组中存储了什么?
如果它的对象不起作用,如果它只是字符串或数字那么它应该没问题。
您采取的后续步骤应该是启用异常断点,并且可以打印所有可能的内容,以便您可以确定问题的确切位置。
作为黑暗中的一个镜头,我建议也许(identity.text!)以nil
出现你也应该把它改成这个
if let tabledata: NSArray = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA"){
myArray = [tabledata!]
tableView.reloadData()
}
这将使代码甚至不会尝试运行,除非它有一个可以使用的值
答案 4 :(得分:2)
最新的swift3版本,用于将数据数组存储到userdefaults并使用键获取该数据数组
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 )
}
答案 5 :(得分:1)
这在swift 3中有所改变。 请注意,这适用于设备,但不适用于游乐场或模拟器
//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)
}
答案 6 :(得分:-1)
存储到用户默认值
let arrayFruit = ["Apple","Banana","Orange","Grapes","Watermelon"]
//store in user default
UserDefaults.standard.set(arrayFruit, forKey: "arrayFruit")
从用户默认值中检索数组:
if let arr = UserDefaults.standard.array(forKey: "arrayFruit") as? [String]{
print(arr)
}