【问题标题】:(Swift) Storing and retrieving Array to NSUserDefaults(Swift) 将数组存储和检索到 NSUserDefaults
【发布时间】:2015-07-19 01:39:16
【问题描述】:

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

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

【问题讨论】:

    标签: ios swift tableview nsuserdefaults


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      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: customeobject array)
      【解决方案3】:

      保存和检索字符串数组到 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查看更多信息

      【讨论】:

        【解决方案4】:

        你在数组中存储了什么?

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

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

        作为在黑暗中的镜头,我建议也许 (identity.text!) 会以 nil 的形式出现

        你也应该把它改成这个

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

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

        【讨论】:

        • 我打印了identity.text!这工作正常。所以问题不存在。我尝试运行您的代码,但仍然遇到同样的错误。
        • println("(tabledata)') 是什么返回 nil
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            存储到用户默认值:

            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
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-10-07
            • 1970-01-01
            • 2015-06-15
            • 1970-01-01
            • 1970-01-01
            • 2018-08-18
            • 1970-01-01
            相关资源
            最近更新 更多