私は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は保存と読み込みの問題を解決しました私のデータモデルを改良することによって。代わりにコアデータを使用してデータを保存およびロードする。
しかし、上記のコードが読み込まれない理由はまだ分かりません。どうやら、チェックリストの内容は保存されません。
こんにちは、お返事ありがとうございます!しかし、私のチェックリストはNSCodingから継承していますが、まだ動作しません。あなたがそれをチェックできるように、私はそれを含めるために投稿を更新します。 –
あなたのコードはどのようにして動作しませんか?ロードまたは保存しようとするとエラーがスローされますか?または、データが間違って再作成されたり、いくつかのものが欠落していますか? – GoatInTheMachine
エラーはスローされませんでした。アプリケーションが再起動されたときにデータが読み込まれなかったか、またはデータが最初に保存されませんでした。私がGETメソッドを使用せず、チェックリスト項目をviewController内のdataModelに追加するだけで、それは機能します。私はそれがGETメソッドと関係があると信じています。とにかく、私はCore Dataを使用してそれを保存し、私のデータモデル全体を改良したものにしました。私はまだ上のコードがうまくいかない理由はまだ分かりません。 –