2016-01-21 23 views
20

Jedna z moich kart (w mojej aplikacji opartej na tabulatorach) działa na iOS 9, ale nie działa na iOS 8. W szczególności podczas próby załadowania danych z plist pojawia się błąd pokazany poniżej.Kod iOS Działa na iOS 9, ale nie na iOS 8?

Mam zakładkę "Planner", która zapisuje wpisy w pliku plist. iOS 8 Błąd - reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30)'

Kod Oszczędność:

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

I AppDelegate kod preparatu:

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)") 
    } 

} 

kod, w którym mogę zapisać elementy do 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

Upewnij się, że używasz NSKeyedArchiver do archiwizacji. I sprawdź przed archiwizacją, czy dane są zerowe. –

+1

Proszę udostępnić plik planner.plist. –

+1

Czy używasz domyślnego pliku plist dołączonego do twojej aplikacji? (Wygląda na to, ale chcesz potwierdzić.) Czy możesz pokazać kod podczas zapisywania pliku plist? –

Odpowiedz

1

I "Nie jestem pewien, czy to pomoże, ale warto spróbować:

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

W „Zapisywanie kodu” w powyższej linii, spróbuj użyć NSDictionary zamiast Dictionary podczas jazdy po systemów iOS 8. Myślę, że gdzieś czytałem, dopiero niedawno wprowadzili klasę Dictionary. Nie jestem tego pewien i jestem nowicjuszem jeśli chodzi o iOS, ale warto spróbować ... to może zadziałać. Jeśli to działa, po prostu umieść linię Dictionary w stanie if #available(ios 9.0 *).

+0

Cześć Ilan, naprawdę próbowałem tego, ale nigdy nie działało. Udało mi się go uruchomić, sprawdzając liczbę bajtów (pusty słownik zawierał 42 bajty). To dziwne rozwiązanie, ale działało :) – dannybess

+0

To dość obejście. cieszę się, że to zadziałało! –