2017-02-22 1 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

오류는 'Day'가'NSCoding'을 따르지 않음을 나타냅니다. – vadian

+0

내 프로젝트의 이름입니다. –

답변

0

NSCoding을 준수하려면 전체 개체 그래프가 필요합니다. 즉, Day 객체와 같이 인코딩하려고하는 모든 하위 객체는 init(coder:)encode(coder:)을 구현해야합니다.

NSCoding을 준수하려면 개체가 NSObject이어야합니다. Day 개체가 NSCoding에 부합하지 않는 것으로 추측됩니다.

+0

예, 문제가 해결되었습니다. 하지만 누구나 필요한 init (코더 :)의 목적이 무엇인지 말해 줄 수 있습니까? 나는 패스 해야할지 모르겠다. 그래서 나는 다른 init()으로 오버라이드하고 여전히 작동한다 ... –

관련 문제