我是Swift和iOS中的新成员,在制作应用程序时遇到此问题。我想基本上使用NSCoding存储用户数据到本地存储。但是,我的代码不能这样做。任何人都可以告诉我它有什么问题?非常感激!Swift,NSCoding保存不能正常工作的类的数组
另外,saveChecklist和LoadChecklist均在appDelegate中的applicationDidEnterBackground和applicationWillTerminate下调用。
我有一种感觉,我的问题在于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()
}
}
UPDATE
解决保存和加载问题通过修改我的数据模型。使用Core Data来保存和加载数据。
但是,我仍然不知道为什么上面的代码不加载。显然,它不会保存清单的内容。
嗨,谢谢你的回答!然而,我的清单继承自NSCoding,它仍然不起作用。我会更新该文章以包含它,以便您可以检查它。 –
好的,你的代码不能用什么方式工作?当你尝试加载或保存时,你会得到一个错误吗?或者数据刚刚重新创建/缺少一些内容? – GoatInTheMachine
没有发生任何错误,只是数据在重新启动应用程序时未加载,或者数据未保存起始。如果我没有使用GET方法,并且只在viewController的dataModel中附加一个清单项,它就可以工作。我相信它与GET方法有关。无论如何,我已经决定使用Core Data来存储它,并且修改了我的整个数据模型,现在它可以工作。我仍然不知道为什么上面的代码不起作用。 –