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

(Swift) Storing and retrieving Array to NSUserDefaults

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

但我明白了

fatal error: unexpectedly found nil while unwrapping an Optional value

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

你在数组中存储了什么?

如果是对象就不行,如果只是字符串或者数字应该没问题。

下一步你应该打开异常断点,也许 println() 一切都可以,这样你就可以查明问题的确切位置。

在黑暗中我建议可能 (identity.text!) 结果为零

你也应该改成这样

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

    myArray = [tabledata!]

    tableView.reloadData()
}

这将使代码甚至不会尝试 运行 除非有它可以使用的值

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

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

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

以下是您可以在 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)
}

希望对您有所帮助。

将字符串数组保存和检索到 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

查看更多

这已在 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)
}

最新的 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 )
}

存储到用户默认值:

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