2016-11-29 24 views
1

Дефект моего приложения рушится из-за сбоя NSException. Я использовал инструмент контрольной точки исключения, чтобы определить место, где он сбой (добавлен комментарий поверх него, внутри init()) во время NSUnarchiver и в файле ItemStore. Помогите мне исправить эту ошибку, я уже пробовал все свои идеи.NSKeyedUnArchiver Crash

без исключения Breakpoint, это крушение

2016-11-29 09:46:42.546 Foodie[3100:386241] *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (Photomania.Item) for key (NS.objects); the class may be defined in source code or a library that is not linked' 

Когда я использую точку останова, исключение, я получаю исключение на помеченной линии ниже в ItemStore.

ItemStore.swift:

import Foundation 

class ItemStore { 

var allItems: [Item] = [] 
let itemArchiveURL: NSURL = { 
    let documentsDirectories = 
    NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, 
     inDomains: .UserDomainMask) 
    let documentDirectory = documentsDirectories.first! 
    return documentDirectory.URLByAppendingPathComponent("items.archive") 
    }() 

init() { 

    // here is the crash 
    if let archivedItems = 
     NSKeyedUnarchiver.unarchiveObjectWithFile(itemArchiveURL.path!) as? [Item] { 
      allItems += archivedItems 
    } 
} 

func moveItemAtIndex(fromIndex: Int, toIndex: Int) { 
    if fromIndex == toIndex { 
     return 
    } 

    // Get reference to object being moved so you can re-insert it 
    let movedItem = allItems[fromIndex] 

    // Remove item from array 
    allItems.removeAtIndex(fromIndex) 

    // Insert item in array at new location 
    allItems.insert(movedItem, atIndex: toIndex) 
} 

func createItem() -> Item { 
    let newItem = Item(random: true) 

    allItems.append(newItem) 

    return newItem 
} 

func removeItem(item: Item) { 
    if let index = allItems.indexOf(item) { 
     allItems.removeAtIndex(index) 
    } 
} 

func saveChanges() -> Bool { 
    print("Saving items to: \(itemArchiveURL.path!)") 
    return NSKeyedArchiver.archiveRootObject(allItems, toFile: itemArchiveURL.path!) 
} 

} 

App Делегат:

import UIKit 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 

// Override point for customization after application launch. 

//Create an ImageStore 
//let imageStore = ImageStore() 
//let itemStore = ItemStore() 

//Access the ItemsViewController and set its item store 
//let navController = window!.rootViewController as! UINavigationController 
//let itemsController = navController.topViewController as! ItemsViewController 

//itemsController.itemStore = itemStore 
//itemsController.imageStore = imageStore 

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    let rootController = window?.rootViewController 

    if rootController is UITabBarController { 
     let firstTabItem = (rootController as! UITabBarController).viewControllers?[0] 

     if firstTabItem is UINavigationController { 

      let firstController = (firstTabItem as! UINavigationController).viewControllers.first as! ItemsViewController 
      firstController.itemStore = ItemStore() 
      firstController.imageStore = ImageStore() 
     } 
    } 
    return true 
} 

... 

} 

Photomania.Item:

import UIKit 

class Item: NSObject, NSCoding { 

var meal: String 
var restaurantName: String? 
var valueInDollars: Int 
let dateCreated: NSDate 
let itemKey: String 

init(meal: String, restaurantName: String?, valueInDollars: Int) { 
    self.meal = meal 
    self.restaurantName = restaurantName 
    self.valueInDollars = valueInDollars 
    self.dateCreated = NSDate() 
    self.itemKey = NSUUID().UUIDString 
} 

convenience init(random: Bool = false) { 
    if random { 
     let nouns = ["Meal"] 
     let places = ["Restaurant"] 

     var idx = arc4random_uniform(UInt32(nouns.count)) 
     let randomNoun = nouns[Int(idx)] 

     idx = arc4random_uniform(UInt32(places.count)) 
     let randomPlace = places[Int(idx)] 

     let randomName = "\(randomNoun)" 
     let randomValue = Int(arc4random_uniform(100)) 
     let randomRestaurantName = "\(randomPlace)" 

     self.init(meal: randomName, 
      restaurantName: randomRestaurantName, 
      valueInDollars: randomValue) 
    } 
    else { 
     self.init(meal: "", restaurantName: nil, valueInDollars: 0) 
    } 
} 

    required init(coder aDecoder: NSCoder) { 
    meal = aDecoder.decodeObjectForKey("meal") as! String 
    dateCreated = aDecoder.decodeObjectForKey("dateCreated") as! NSDate 
    itemKey = aDecoder.decodeObjectForKey("itemKey") as! String 
    restaurantName = aDecoder.decodeObjectForKey("restaurantName") as! String? 

    valueInDollars = aDecoder.decodeIntegerForKey("valueInDollars") 

    super.init() 
} 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(meal, forKey: "meal") 
     aCoder.encodeObject(dateCreated, forKey: "dateCreated") 
     aCoder.encodeObject(itemKey, forKey: "itemKey") 
     aCoder.encodeObject(restaurantName, forKey: "restaurantName") 

     aCoder.encodeInteger(valueInDollars, forKey: "valueInDollars") 
    } 

} 
+0

Пожалуйста, сообщите полную информацию об аварии. Каково исключение? Какова полная ошибка и обратная связь? – JAL

+0

@JAL Я редактировал свой вопрос с подробностями. – Allie

+0

Что такое 'Photomania.Item'? – JAL

ответ

-1

Вы did'nt показать ваш класс Photomania.Item/структура, но это должен соответствовать протоколу NSCoding. Посмотрите на этот пример: http://mhorga.org/2015/08/25/ios-persistence-with-nscoder-and-nskeyedarchiver.html

+0

Я не понимаю, как это относится к моему классу. Я попытался вставить примеры материалов, но было много ошибок. Я добавил оригинальный класс Photomania.Item в конец моего вопроса. – Allie

+0

Вы снова добавили ItemStore, я не вижу класс Item –

+0

Я его исправил. Извините – Allie

 Смежные вопросы

  • Нет связанных вопросов^_^