(Swift) 将数组存储和检索到 NSUserDefaults
Posted
技术标签:
【中文标题】(Swift) 将数组存储和检索到 NSUserDefaults【英文标题】:(Swift) Storing and retrieving Array to NSUserDefaults 【发布时间】:2015-07-19 01:39:16 【问题描述】:我正在尝试将数组存储到 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
价值
尝试加载数据时。我不确定问题出在存储还是检索中。有没有人经历过这种情况?
【问题讨论】:
【参考方案1】:从您的代码中我看到您正在存储一些数组
// 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")
如果它是一个数组,我会选择第一个。
【讨论】:
【参考方案2】:在NSKeyArchive
的帮助下,您可以通过以下方式存储和检索对象数组。
将数组存储到 NSUserDefault。
let placesData = NSKeyedArchiver.archivedData(withRootObject: placesArray)
UserDefaults.standard.set(placesData, forKey: "places")
从 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)
希望对您有所帮助。
【讨论】:
对于自定义对象数组,它不起作用,请您帮帮我。 let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: customeobject array)【参考方案3】:保存和检索字符串数组到 UserDefaults
保存数组
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]()
在How to save user settings using NSUserDefaults查看更多信息
【讨论】:
【参考方案4】:你在数组中存储了什么?
如果是对象就不行,如果只是字符串或数字应该没问题。
接下来的步骤应该是打开异常断点,也许 println() 一切尽你所能,这样你就可以查明问题的确切位置。
作为在黑暗中的镜头,我建议也许 (identity.text!) 会以 nil 的形式出现
你也应该把它改成这个
if let tabledata: NSArray = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA")
myArray = [tabledata!]
tableView.reloadData()
这将使代码甚至不会尝试运行,除非有可以使用的值
【讨论】:
我打印了identity.text!这工作正常。所以问题不存在。我尝试运行您的代码,但仍然遇到同样的错误。 println("(tabledata)') 是什么返回 nil【参考方案5】:最新的 swift3 版本将数据数组存储到 userdefaults 并使用键获取该数据数组
let nameArray = ["Ramu","JAGAN","Steve","Swift"]
let namesArrayData = NSKeyedArchiver.archivedData(withRootObject: nameArray)
UserDefaults.standard.set(namesArrayData, forKey: "arrayData")
检索数据
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 )
【讨论】:
【参考方案6】:这在 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)
【讨论】:
【参考方案7】:存储到用户默认值:
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)
【讨论】:
你会照顾它的。谢谢@Moritz以上是关于(Swift) 将数组存储和检索到 NSUserDefaults的主要内容,如果未能解决你的问题,请参考以下文章
Swift 5 将 AVAsset 保存到 UserDefaults