2017-02-22 30 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()覆蓋,它仍然可以工作...... –