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

Ios (Swift)将数组存储和检索到NSUserDefault,ios,swift,tableview,nsuserdefaults,Ios,Swift,Tableview,Nsuserdefaults,我正在尝试将数组存储到NSUserDefaults,并在需要填充UITableView时检索数组 目前我正在使用: //store data NSUserDefaults.standardUserDefaults().setObject(myArray, forKey: "\(identity.text!)listA") NSUserDefaults.standardUserDefaults().synchronize() //retrieve data

我正在尝试将数组存储到
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
价值观


当尝试加载数据时。我不确定问题是在存储中还是在检索中。以前有人这样做过吗?

您在阵列中存储了什么

如果它是对象,它将不起作用,如果它只是字符串或数字,那么它应该是好的

接下来的步骤应该是打开异常断点,或者尽可能地打开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")
可能存在类型不匹配,您存储一个类型,然后检索另一个类型

检索时,请使用
ArrayWorkey()
objectForKey()
查看下面的代码

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


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

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

将数组存储到NSUserDefault。

let placesData = NSKeyedArchiver.archivedData(withRootObject: placesArray)
UserDefaults.standard.set(placesData, forKey: "places")
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)
}
从NSUserDefault检索数组。

let placesData = NSKeyedArchiver.archivedData(withRootObject: placesArray)
UserDefaults.standard.set(placesData, forKey: "places")
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]()

更多信息请参见

,这在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)
}
从用户默认值检索数组:

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

我打印了identity.text!这是正常工作。因此,问题并不存在。我试着运行你的代码,但仍然出现同样的错误。println(“(tabledata)”)是为自定义对象数组返回的值。它不工作。请帮我解决。让encodedData:Data=NSKeyedArchiver.archivedData(withRootObject:customeobject数组)你会处理它。谢谢@Moritz