(Swift)将数组存储和检索到NSUserDefaults中

22

我正在尝试将一个数组存储到 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()

但是我遇到了致命错误:

尝试加载数据时意外发现空值(nil)并解包Optional值

我不确定问题是出在存储还是检索上。有没有人经历过这种情况?

7个回答

34

从您的代码中,我看到您正在存储一些数组

// 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")

如果它是一个数组,我会选择第一个。


11

以下是使用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: 自定义对象数组) - kalpa

9

将字符串数组保存到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]()

请访问如何使用NSUserDefaults保存用户设置了解更多信息。


2

你在数组中存储的是什么?

如果是对象,它将无法工作;如果只是字符串或数字,则应该可以。

接下来,您应该打开异常断点,可能会使用println()函数输出所有可能的内容,以便您可以精确定位问题所在。

我猜可能(identity.text!)返回了空值。

此外,您应该将其更改为以下内容:

if let tabledata: NSArray = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA"){

    myArray = [tabledata!]

    tableView.reloadData()
}

这将使代码不会尝试运行,除非有可用的值。

我打印了identity.text!并且它正常工作。所以问题不在那儿。我尝试运行你的代码,但我仍然收到相同的错误。 - William Larson
println("(tabledata)') 返回了 nil。 - William Larson

2

如何使用最新的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 )
}

1
这在Swift 3中已经更改。请注意,此方法适用于设备,但不适用于Playground或模拟器。
//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)
}

-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)
}

好的,我会处理的。谢谢@Moritz。 - Mr.Javed Multani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接