Подтвердить что ты не робот

Код iOS работает на iOS 9, но не на iOS 8?

Одна из моих вкладок (в моем приложении на основе табуляции) работает на iOS 9, но не работает на iOS 8. В частности, при попытке загрузить данные из plist я получаю приведенную ниже ошибку.

У меня есть вкладка "Планировщик", которая сохраняет записи в plist. Ошибка iOS 8 - reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30)'

Сохранение кода:

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    plistPath = appDelegate.plistPathInDocument
    plistPath2 = appDelegate.plist2PathInDocument
    // Extract the content of the file as NSData
    let data:NSData =  NSFileManager.defaultManager().contentsAtPath(plistPath)!
    let data2:NSData = NSFileManager.defaultManager().contentsAtPath(plistPath2)!
    do{
        if(numOfViewWillAppear == 0)
        {
            if let x = NSKeyedUnarchiver.unarchiveObjectWithData(data2)
            {
                self.sortedSections = NSKeyedUnarchiver.unarchiveObjectWithData(data2) as! [String]
                self.sections = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! Dictionary
            }
            numOfViewWillAppear++
        }
    }

И код подготовки AppDelegate:

    func preparePlist()
{
    let rootPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)[0]
    let url = NSURL(string: rootPath)
    plistPathInDocument = (url?.URLByAppendingPathComponent("planner.plist").path)!

    if !NSFileManager.defaultManager().fileExistsAtPath(plistPathInDocument){
        let plistPathInBundle = NSBundle.mainBundle().pathForResource("planner", ofType: "plist")!
        do {
            try NSFileManager.defaultManager().copyItemAtPath(plistPathInBundle, toPath: plistPathInDocument)
            print("plist copied")
        }
        catch{
            print("error copying plist!")
        }
    }
    else{
        print("plst exists \(plistPathInDocument)")
    }

}

Код, в котором я сохраняю элементы на plist:

self.sections[todoItem.dueDate] = [Assignment(name: todoItem.name, dueDate: todoItem.dueDate)]
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
plistPath = appDelegate.plistPathInDocument
do{
  let sectionsData = NSKeyedArchiver.archivedDataWithRootObject(sections)
  sectionsData.writeToFile(plistPath, atomically: true)
}
4b9b3361

Ответ 1

Я не уверен, что это поможет, но стоит попробовать:

self.sections = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! Dictionary

В "сохранении кода" в вышеупомянутой строке попробуйте использовать NSDictionary вместо Dictionary при работе на iOS8. Я думаю, что я где-то читал, они только недавно представили класс Dictionary. Я не уверен в этом, и я немного новичок, когда дело доходит до iOS, но стоит попробовать... это может сработать. Если он работает, просто поместите строку Dictionary в условие if #available(ios 9.0 *).