2016-05-12 6 views
0

Versuch addObject zu Array innerhalb plist zu retten, aber nicht wissen, wie es zu tun ...Schreib-/Lese Plist in swift 2.1

die Struktur des Plist ist wie folgt:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Location</key> 
    <array> 
     <string>test</string> 
     <string>test2</string> 
    </array> 
    <key>UserID</key> 
    <array> 
     <string>use1</string> 
     <string>user2</string> 
    </array> 
</dict> 
</plist> 

das ist, was ich benutze:

Lese plist aus Dokumenten Verzeichnis funktioniert .... in meinem viewDidLoad

guard 
      let fileURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first?.URLByAppendingPathComponent("MyPlist.plist") 
      else { fatalError("Unable to get file") } 

     let dict = NSDictionary(contentsOfURL: fileURL) 
     locationArray = dict?.objectForKey("Location") as! NSMutableArray 
     userIDArray = dict?.objectForKey("UserID") as! NSMutableArray 

in meiner speichern func:

guard 
     let fileURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first?.URLByAppendingPathComponent("MyPlist.plist") 
     else { fatalError("Unable to get file") } 

    let dict = NSMutableDictionary(contentsOfURL: fileURL) 

    dict?.setObject(userDefaultLocationTextField.text!, forKey: "Location") 
    dict?.writeToURL(fileURL, atomically: true) 

aber es scheint, dass nichts in meinem plist geschrieben ...

Dank.

+0

Ist das Wörterbuch im Speicher ist (verwenden Sie den Debugger, um herauszufinden) erfolgreich aktualisiert? Dadurch erfahren Sie, wo das Problem liegt (Aktualisierung im Speicher oder Schreiben in Datei). Ich bin kein Experte mit Swift aber das 'wie! NSMutableArray's sieht falsch aus ... – trojanfoe

+0

ich glaube nicht. Array hat nur ein Objekt, nachdem ich den neuen Wert gespeichert habe –

+0

Sie scheinen dieses Problem nicht lösen zu wollen. – trojanfoe

Antwort

2

Statt der einfachen NSDictionary(contentsOfURL: fileURL) Ich empfehle die NSPropertyListSerialization Klasse zu verwenden.

Aufgrund Swifts Werttyp Semantik Sie den Root-Wörterbuch aktualisieren müssen, nachdem eines des Arrays zu ändern, zum Beispiel

guard 
    let fileURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first?.URLByAppendingPathComponent("MyPlist.plist"), 
    fileData = NSData(contentsOfURL: fileURL) 
    else { fatalError("Unable to get file") } 

do { 
    var dict = try NSPropertyListSerialization.propertyListWithData(fileData, options: .MutableContainersAndLeaves, format: nil) as! [String:AnyObject] 

    var locationArray = dict["Location"] as! [String] 
    locationArray.append(userDefaultLocationTextField.text!) 
    dict["Location"] = locationArray // this line is crucial to update the enclosing dictionary 

    let outputData = try NSPropertyListSerialization.dataWithPropertyList(dict, format: NSPropertyListFormat.XMLFormat_v1_0, options: 0) 
    try outputData.writeToURL(fileURL, options: .AtomicWrite) 
} catch let error as NSError { 
    print(error) 
} 
+0

Danke für Ihre Eingabe und Ihren Vorschlag. Ist meine Lösung "unsicher" oder ist dies der "richtige" Weg? –

+0

Ihre Lösung sollte auch funktionieren, aber 'NSPropertyListSerialization' ist die dedizierte Klasse zum Serialisieren von Eigenschaftslisten. In Bezug auf Ihr Problem in der Frage besteht die entscheidende Information darin, das Wurzelwörterbuch zu aktualisieren. Und die Verwendung der nativen Swift-Typen vermeidet die Verwirrung, was Referenz und was Werttyp ist. – vadian

+0

Berücksichtigen Sie auch Core Data zum Speichern der Arrays. Selbst für kleine Datenmodelle ist es bequemer als einfache Eigenschaftslisten. – vadian

0

das scheint jetzt für mich zu arbeiten: Denken Sie, dass das richtig ist?

guard 
      let fileURL = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first?.URLByAppendingPathComponent("MyPlist.plist") 
      else { fatalError("Unable to get file") } 

     let dict = NSMutableDictionary(contentsOfURL: fileURL) 
     locationArray = dict?.objectForKey("Location") as! NSMutableArray 
     locationArray.addObject(userDefaultLocationTextField.text!) 


     dict?.setObject(locationArray, forKey: "Location") 
     dict?.writeToURL(fileURL, atomically: true) 
     print(dict)