2017-02-22 12 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 
} 

そして、私は別のクラスから達成しよう:ボタンを保存するまで、すべてが完璧にうまく動作します

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

押すとプログラムがsubmitDay機能を打っています。 ターミナルがキャッチされない例外により「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()でオーバーライドし、それはまだ動作します... –

関連する問題