2016-04-26 7 views
1

私はSwiftとiOSで新しく、私はこの問題をアプリケーションの作成中に見つけました。基本的にNSCodingを使用してローカルストレージにユーザーデータを格納する必要があります。しかし、以下の私のコードはそれをしません。誰でも私にそれが間違っていると教えてくれる?とても有難い!Swift、NSCodingが動作しないクラスの配列を保存します。

また、saveChecklistとLoadChecklistの両方が、applicationDidEnterBackgroundおよびapplicationWillTerminateの下のappDelegateで呼び出されます。

GETを使用してChecklistアイテムをリストに追加すると、問題がencodeWithCoderとinit(aDecoder)にあると感じました。

マイ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は保存と読み込みの問題を解決しました私のデータモデルを改良することによって。代わりにコアデータを使用してデータを保存およびロードする。

しかし、上記のコードが読み込まれない理由はまだ分かりません。どうやら、チェックリストの内容は保存されません。

答えて

1

ChecklistクラスもNSCodingから継承し、encodeWithCoder(coder: NSCoder)メソッドを実装する必要があります。 ThisはNSCodingに関する良いチュートリアルです。

+0

こんにちは、お返事ありがとうございます!しかし、私のチェックリストはNSCodingから継承していますが、まだ動作しません。あなたがそれをチェックできるように、私はそれを含めるために投稿を更新します。 –

+0

あなたのコードはどのようにして動作しませんか?ロードまたは保存しようとするとエラーがスローされますか?または、データが間違って再作成されたり、いくつかのものが欠落していますか? – GoatInTheMachine

+1

エラーはスローされませんでした。アプリケーションが再起動されたときにデータが読み込まれなかったか、またはデータが最初に保存されませんでした。私がGETメソッドを使用せず、チェックリスト項目をviewController内のdataModelに追加するだけで、それは機能します。私はそれがGETメソッドと関係があると信じています。とにかく、私はCore Dataを使用してそれを保存し、私のデータモデル全体を改良したものにしました。私はまだ上のコードがうまくいかない理由はまだ分かりません。 –

関連する問題