2017-02-22 61 views
-1

我需要保存名为Day的对象。Swift - NSCoding归档不起作用

class TimeSheet: NSObject, NSCoding{ 

static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first! 
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("TimeSheet") 

private static var days:[Day] = [] 


required init?(coder aDecoder: NSCoder){ 
    guard let days = aDecoder.decodeObject(forKey: "days") as? [Day] else{ 
     os_log("No previous day data available.", log: OSLog.default, type: .debug) 
     return nil 
    } 
    TimeSheet.days = days 
} 

func encode(with aCoder: NSCoder){ 
    aCoder.encode(TimeSheet.days, forKey: "days") 
} 

static func addDay(day: Day) -> Bool{ 
    TimeSheet.days.append(day) 
    return TimeSheet.submitDay() 
} 

private static func submitDay() -> Bool{ 
    return NSKeyedArchiver.archiveRootObject(TimeSheet.days, toFile: TimeSheet.ArchiveURL.path) 
} 

static func loadDays(){ 
    guard let tempDays = NSKeyedUnarchiver.unarchiveObject(withFile: TimeSheet.ArchiveURL.path) as? [Day] else{ 
     print("Could not loaded...") 
     return 
    } 
    TimeSheet.days = tempDays 
} 

我尝试从不同的类实现:按下和程序打submitDay功能,直到保存按钮

@objc private func buttonPressed(button: UIButton!){ 
    if(TimeSheet.addDay(day: day)){ 
     print("Saved") 
    }else{ 
     print("Not Saved") 
    } 
} 

一切工作完全正常。 终端抛出终止应用程序由于未捕获的异常“NSInvalidArgumentException”,原因是:“ - [DayManager.Day encodeWithCoder:]:无法识别的选择发送到实例0x6000003391e0”

这是使用NSCoding我的第一次,我无法弄清楚什么是出错...

任何帮助将不胜感激。 谢谢

+1

什么是DayManager?您的Day课程是否符合NSCoding? –

+1

错误显示'日'不符合'NSCoding' – vadian

+0

这是我的项目的名称。 –

回答

0

你需要你的整个对象图符合NSCoding。这意味着您尝试编码的所有子对象(例如Day对象)也需要实现init(coder:)encode(coder:)

为了符合NSCoding,您的对象需要是NSObject s。我猜你的Day对象不符合NSCoding

+0

是的,它确实解决了这个问题。但任何人都可以告诉我所需的init(编码器:)的目的是什么?我不知道要传递什么,所以我只是用另一个init()覆盖,它仍然可以工作...... –