(Swift)将数组存储和检索到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() 

但是我明白了

致命错误:意外地发现nil而解包一个可选值

当试图加载数据。 我不确定问题是在存储还是在检索中。 有没有人通过这个之前呢?

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

 // Your code NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "\(identity.text!)listA") 

并检索一个string

 //Your code let tabledata = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA") 

有可能是一种types不匹配,你存储一种types和检索另一种types。

虽然检索使用arrayForKey()objectForKey()请参阅下面的代码。

 let tabledata = NSUserDefaults.standardUserDefaults().arrayForKey("\(identity.text!)listA") 

要么

 let tabledata = NSUserDefaults.standardUserDefaults().objectForKey("\(identity.text!)listA") 

如果这是一个数组,我会去第一个。

这里是你可以在NSKeyArchive帮助下存储和检索对象数组的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) } 

希望这对你有所帮助。

我来到这个问题寻找如何保存一个string数组UserDefaults,但没有find一个明确的答案在这里。 不过,我的确find了如何使用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]() 

你在数组中存储什么?

如果它的对象不起作用,如果它只是string或数字,那么它应该没问题。

你接下来的步骤应该是打开exception断点,也许println()所有你可以确定的问题的确切位置。

作为一个在黑暗中的镜头,我会build议也许(identity.text!)是出来作为零

你也可以把它改成这个

 if let tabledata: NSArray = NSUserDefaults.standardUserDefaults().stringForKey("\(identity.text!)listA"){ myArray = [tabledata!] tableView.reloadData() } 

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

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

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