2016-10-23 18 views
1

私は開発者appleのFoodTrackerデモに従っています。私は最後のセクションにあります:データを保存してください。未知の例外 'NSInvalidArgumentException'のためアプリを終了します、理由: '+ [NSKeyedArchiver unarchiveObjectWithFile:]

私はXcodeの8を実行している、と私は、コードをダウンロードし、スウィフト2.3に変換する場合、それは動作しませんスウィフト3.

のデモの建物を、次のよ。私がSwift 3.0に変換しても、それは動作しません。私はSwift 3のデモに従っています。

Swift 3でコンパイルして実行するにはコードを変更する必要があり、これまで成功しています。

しかし、私は今、実行時にこれを取得しています:

FoodTracker [1597:720222] ***キャッチされない例外により 'NSInvalidArgumentException' にアプリを終了、理由:「+ [NSKeyedArchiver unarchiveObjectWithFile:]:認識されていないセレクタ私は、このセクションのために何していた変化はなかった

クラス0x1081497a8' に送られた:私は、構造体を追加した食事のクラスにも

static let DocumentsDirectory = 
    FileManager().urls(for: .documentDirectory, in: 
    .userDomainMask).first! 
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("meals") 

2):食事のクラスで) 1私は2つの静的定数を追加しましたと共同nvenienceのINIT:

func encode(with aCoder: NSCoder) { 
    aCoder.encode(name, forKey: PropertyKey.nameKey) 
    aCoder.encode(photo, forKey: PropertyKey.photoKey) 
    aCoder.encode(rating, forKey: PropertyKey.ratingKey) 
} 

required convenience init?(coder aDecoder: NSCoder) { 
    let name = aDecoder.decodeObject(forKey: PropertyKey.nameKey) as! String 

    // Because photo is an optional property of Meal, use conditional cast 
    let photo = aDecoder.decodeObject(forKey: PropertyKey.photoKey) as? UIImage 

    let rating = aDecoder.decodeInteger(forKey: PropertyKey.ratingKey) 

    // Must call designated initializer 
    self.init(name: name, photo: photo, rating: rating) 
} 

3)MealTableViewControllerクラスでは、私は、関数のsaveMealsとloadMealsを追加しました:

func saveMeals() { 
    let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(meals, toFile: Meal.ArchiveURL.path) 
    if !isSuccessfulSave { 
     print("Failed to save meals...") 
    } 
} 

func loadMeals() -> [Meal]? { 
    return NSKeyedArchiver.classForKeyedUnarchiver().unarchiveObject(withFile: Meal.ArchiveURL.path) as? [Meal] 
} 

コードのコンパイルが成功したが、実行時にクラッシュします。エラースタックトレースの5行目は、犯人として食事のクラスとloadMealsメソッドを指すように思える:

5 FoodTracker 0x0000000107ce9e44 _TFC11FoodTracker23MealTableViewController9loadMealsfT_GSqGSaCS_4Meal__ + 276 
6 FoodTracker 0x0000000107ce701a _TFC11FoodTracker23MealTableViewController11viewDidLoadfT_T_ + 266 
7 FoodTracker 0x0000000107ce7222 _TToFC11FoodTracker23MealTableViewController11viewDidLoadfT_T_ + 34 

残念ながら、私はXcodeとスウィフトは、のために残しているパン粉を追跡するために、この時点でより多くを知りません私。ソースから覚えようとしているだけです(Apple Developers)。

私はウェブとこのサイトで検索を行ってきましたが、私が問題を解決するために使用できた答えはまだ見つかりませんでした。これはチュートリアルの最後のセクションであり、私は本当にそれを完了したいと思います。あなたが提供できる援助をありがとうございます。私はスウィフトを熟知してからそれを払うことを望みます。ありがとうございました!

答えて

1

使用NSKeyedUnarchiver

func loadMeals() -> [Meal]? { 
    return NSKeyedUnarchiver.unarchiveObject(withFile: Meal.ArchiveURL.path) as? [Meal] 
} 
+0

Thxを!それがまさにそれだった。今度はチュートリアルのコードを見て、NSKeyeedUnarchiverが実際に指定されていることを確認します...間違った自動補完オプションを選択して、キーワードの違いを特定できなかったはずです。私が認めることを恐れているコードの詳細にもっと注意を払わなければならない。 – PixelStack

関連する問題