2016-01-21 17 views
20

Una delle mie schede (nell'applicazione basata su schede) funziona su iOS 9, ma non funziona su iOS 8. In particolare, quando si tenta di caricare i dati da un plist, viene visualizzato l'errore mostrato di seguito.Codice iOS Funziona su iOS 9 ma non su iOS 8?

Ho una scheda "Pianificatore" che salva le voci in un plist. iOS 8 Errore - reason: '*** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x62, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x30, 0x30)'

Codice di risparmio:

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

E AppDelegate codice di preparazione:

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

} 

codice in cui salvare gli elementi al 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

Assicurarsi di utilizzare NSKeyedArchiver per archiviarlo. E controllare prima dell'archiviazione se i dati sono nulli. –

+1

Si prega di condividere il file planner.plist. –

+1

Usi un file plist predefinito in bundle nella tua app? (Sembra così, ma voglio confermare.) Puoi mostrare il codice quando salvi un plist? –

risposta

1

I Non sono sicuro che sarà d'aiuto ma vale la pena provare:

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

Nella "codice di salvataggio" nella riga sopra menzionato, provare a utilizzare NSDictionary invece di Dictionary quando viene eseguito su iOS 8. Penso di aver letto da qualche parte, hanno introdotto solo la classe Dictionary abbastanza recentemente. Non ne sono sicuro e sono una specie di principiante quando si tratta di iOS ma vale la pena provare ... potrebbe funzionare. Se funziona, basta mettere la linea in una condizione if #available(ios 9.0 *).

+0

Ciao Ilan, in realtà ho provato questo, ma non ha mai funzionato. Sono stato in grado di farlo funzionare controllando il numero di byte (il dizionario vuoto conteneva 42 byte). È una soluzione strana, ma ha funzionato :) – dannybess

+0

Questa è una soluzione alternativa. felice ha funzionato per te! –

Problemi correlati