Swift,NSCoding保存一个不起作用的类的数组

时间:2016-04-26 14:23:33

标签: ios swift save nscoding

我是Swift和iOS的新手,我在制作应用时遇到了这个问题。我想基本上使用NSCoding将用户数据存储到本地存储。但是,我的代码不会这样做。谁能告诉我它有什么问题?非常感激!

此外,在appDelegate中,在applicationDidEnterBackground和applicationWillTerminate下调用saveChecklist和LoadChecklist。

我有一种感觉我的问题在于encodeWithCoder和init(aDecoder),因为我使用GET将我的Checklist项附加到列表中。

我在DataModel.class中的代码:

import Foundation

class DataModel: NSObject, NSCoding {
var checklist = Checklist()
var lists: [Checklist] {
    get {
        return [checklist]
    }
    set {
    }
}

override init() {
    super.init()
    loadChecklist()
}

// MARK: - All the saving stuff

func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(checklist, forKey: "Checklist")
}

required init?(coder aDecoder: NSCoder) {
    checklist = aDecoder.decodeObjectForKey("Checklist") as! Checklist
}

func documentsDirectory() -> String {
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,    .UserDomainMask, true)

    return paths[0]
}

func dataFilePath() -> String {
    return (documentsDirectory() as NSString).stringByAppendingPathComponent("Checklist.plist") // create file if no checklist.plist is present
}

func saveChecklist() {
    let data = NSMutableData()
    let archiver = NSKeyedArchiver(forWritingWithMutableData: data)
    archiver.encodeObject(lists, forKey: "Checklists")
    archiver.finishEncoding()

    data.writeToFile(dataFilePath(), atomically: true)
}

func loadChecklist() {
    let path = dataFilePath()
    if NSFileManager.defaultManager().fileExistsAtPath(path) {
        if let data = NSData(contentsOfFile: path) {
            let unarchiver = NSKeyedUnarchiver(forReadingWithData: data)
            lists = unarchiver.decodeObjectForKey("Checklists") as! [Checklist]

            unarchiver.finishDecoding()
        }
    }
}

我在Checklist.class中的代码:

import Foundation

class Checklist: NSObject, NSCoding {
var item = [items]()
var rituals = [items]()
var doneButtonVisible: Bool
var streak: Int
var itemDoneCount: Int
var startDate: NSDate
var dayHasStarted: Bool

override init() {
    doneButtonVisible = false
    itemDoneCount = 0
    streak = 0
    startDate = NSDate()
    dayHasStarted = false
    super.init()
}

// saves
func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(item, forKey: "Items")
    aCoder.encodeObject(rituals, forKey: "Rituals")
    aCoder.encodeObject(itemDoneCount, forKey: "ItemDoneCount")
    aCoder.encodeObject(doneButtonVisible, forKey: "DoneButtonVisible")
    aCoder.encodeObject(streak, forKey: "Streak")
    aCoder.encodeObject(startDate, forKey: "StartDate")
    aCoder.encodeObject(dayHasStarted, forKey: "DayHasStarted")
}

// loads
required init?(coder aDecoder: NSCoder) {
    item = aDecoder.decodeObjectForKey("Items") as! [items]
    rituals = aDecoder.decodeObjectForKey("Rituals") as! [items]
    itemDoneCount = aDecoder.decodeObjectForKey("ItemDoneCount") as! Int
    doneButtonVisible = aDecoder.decodeObjectForKey("DoneButtonVisible") as! Bool
    streak = aDecoder.decodeObjectForKey("Streak") as! Int
    startDate = aDecoder.decodeObjectForKey("StartDate") as! NSDate
    dayHasStarted = aDecoder.decodeObjectForKey("DayHasStarted") as! Bool
    super.init()
}

}

更新

通过改进我的数据模型解决了保存和加载问题。使用Core Data来保存和加载数据。

但是,我仍然不知道为什么上面的代码没有加载。显然,它不会保存清单的内容。

1 个答案:

答案 0 :(得分:1)

您的Checklist类也需要从NSCoding继承,并实现encodeWithCoder(coder: NSCoder)方法。 This是一个很好的NSCoding教程。