(Swift)将阵列存储和检索到NSUserDefaults

Wil*_*son 18 nsuserdefaults tableview ios swift

我正在尝试将数组存储到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()
Run Code Online (Sandbox Code Playgroud)

但我明白了

致命错误:nil在解包可选值时意外发现

在尝试加载数据时.我不确定问题是存储还是检索.以前有人经历过这个吗?

Viv*_*kar 31

从你的代码我看到你正在存储一些数组

// Your code
NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "\(identity.text!)listA")
Run Code Online (Sandbox Code Playgroud)

并检索一个字符串

//Your code
let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA")
Run Code Online (Sandbox Code Playgroud)

可能存在类型不匹配,您存储一种类型并检索另一种类型.

在检索时使用arrayForKey()objectForKey()查看下面的代码.

let tabledata = NSUserDefaults.standardUserDefaults().arrayForKey("\(identity.text!)listA") 
Run Code Online (Sandbox Code Playgroud)

要么

let tabledata = NSUserDefaults.standardUserDefaults().objectForKey("\(identity.text!)listA")
Run Code Online (Sandbox Code Playgroud)

如果它是一个阵列,我会选择第一个.


Jat*_* JP 10

以下是您可以借助的方式存储和检索对象数组的方法NSKeyArchive.

将阵列存储到NSUserDefault.

let placesData = NSKeyedArchiver.archivedData(withRootObject: placesArray)
UserDefaults.standard.set(placesData, forKey: "places")
Run Code Online (Sandbox Code Playgroud)

从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)
}
Run Code Online (Sandbox Code Playgroud)

希望这对你有所帮助.


Sur*_*gch 10

我来看这个问题,看看如何将一个String数组保存到UserDefaults,但在这里找不到明确的答案.但是,我确实找到了如何使用NSUserDefaults保存用户设置的答案.阅读该文章了解更多信息.

保存和检索String数组到UserDefaults

保存数组

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

let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")
Run Code Online (Sandbox Code Playgroud)

检索数组

let defaults = UserDefaults.standard
let array = defaults.object(forKey: "SavedStringArray") as? [String] ?? [String]()
Run Code Online (Sandbox Code Playgroud)