我是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保存和加载数据。

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

最佳答案

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

关于ios - Swift,NSCoding保存类的数组不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36867779/

10-11 20:13