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

时间:2015-05-08 07:58:17

标签: ios swift tableview 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()

但是我得到了

  

致命错误:在展开Optional时意外发现nil   值

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

7 个答案:

答案 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中找到了答案。阅读该文章了解更多信息。

将String数组保存并检索到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]()

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