NSUserDefaults加载问题

时间:2016-07-05 00:26:11

标签: ios xcode swift nsarray nsuserdefaults

每当我打开我的应用程序时,它都不会加载我的数组值,因为没有调用!= nil函数。我能做些什么吗?

代码:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    var toDoData = NSUserDefaults.standardUserDefaults()
    if (toDoData.valueForKey("TDDATA") != nil){
    todos = toDoData.valueForKey("TDDATA") as! NSArray as! [TodoModel]
   }

    if todos.count != 0{
    toDoData.setValue(todos, forKeyPath: "TDDATA")
    toDoData.synchronize()
    }
}

不要担心桌子。它完美填充。我只需要修复加载数据问题。

您的答案中包含的代码有很多帮助!

感谢。

更新:

这是TodoModel:

import Foundation
import UIKit


class TodoModel : NSObject, NSCoding {
var id: String
var image: String
var title: String
var desc: String
var scores: String


init (id: String, image: String, title: String, desc: String, scores: String) {
    self.id = id
    self.image = image
    self.title = title
    self.desc = desc
    self.scores = scores

  }

}

1 个答案:

答案 0 :(得分:1)

valueForKeysetValue:forKeyPath是KVC(键值编码)方法(阅读herehere)。它不会帮助您读/写用户默认数据库。

查看NSUserDefaults documentation,有许多方法可用于在默认数据库中获取和设置值。由于您使用的是数组,我们将使用:

  • arrayForKey得到。
  • setObject:forKey设置。 (没有特定于阵列的setter)

编辑:在viewDidAppear中尝试此操作。在这里,我们检查是否有数据,如果有,我们会存储它。如果我们没有数据,那么检查默认数据库是否有一些保存。如果是,请改用它。仅在viewDidLoad中加载来自默认数据库的数据,然后保存在viewDidAppear中,甚至更好地保存在添加待办事项时调用的函数将是有利的。

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    let defaults = NSUserDefaults.standardUserDefaults()
    if todos.count > 0 {
        // Save what we have
        let data = NSKeyedArchiver.archivedDataWithRootObject(todos)
        defaults.setObject(data, forKey: "TDDATA")
        defaults.synchronize()
        print("saved \(todos.count)")
    } else if let storedTodoData = defaults.dataForKey("TDDATA"),
        storedTodos = NSKeyedUnarchiver.unarchiveObjectWithData(storedTodoData) as? [TodoModel] {
        // There was stored data! Use it!
        todos = storedTodos
        print("Used \(todos.count) stored todos")
    }
}

此外,我们必须在您的模型中实施NSCoding协议。这应该是这样的:

class TodoModel: NSObject, NSCoding {
    var myInt: Int = 0
    var myString: String?
    var myArray: [String]?

    required init?(coder aDecoder: NSCoder) {
        myInt = aDecoder.decodeIntegerForKey("myInt")
        myString = aDecoder.decodeObjectForKey("myString") as? String
        myArray = aDecoder.decodeObjectForKey("myArray") as? [String]
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeInteger(myInt, forKey: "myInt")
        aCoder.encodeObject(myString, forKey: "myString")
        aCoder.encodeObject(myArray, forKey: "myArray")
    }
}

(当然,用模型可能具有的任何属性替换myInt,myString,myArray等。)