2016-01-21 7 views
20

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

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

Saving Код:

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) 
} 
+0

Убедитесь, что вы используете NSKeyedArchiver для его архивации. И проверьте перед архивированием, если данные равны нулю. –

+1

Просьба поделиться файлом planner.plist. –

+1

Используете ли вы файл plist по умолчанию в вашем приложении? (Он выглядит так, но хочу подтвердить.) Можете ли вы показать код при сохранении plist? –

ответ

1

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

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

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

+0

Привет, Илан, я на самом деле пробовал это, но он никогда не работал. Я смог заставить его работать, проверив количество байтов (пустой словарь содержал 42 байта). Это странное решение, но работало :) – dannybess

+0

Это довольно обходное решение. рад, что это сработало для вас! –

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