2014-07-11 18 views
5

Ho un file plist di esempio, favCities.plist. Questo è il mio codice di esempio:Scrivi nel file plist in Swift

override func viewDidLoad() { 
    super.viewDidLoad() 


    let path = NSBundle.mainBundle().pathForResource("favCities", ofType: "plist") 
    var plistArray = NSArray(contentsOfFile: path) as [Dictionary<String, String>] 

    var addDic: Dictionary = ["ZMV": "TEST", "Name": "TEST", "Country": "TEST"] 
    plistArray += addDic 
    (plistArray as NSArray).writeToFile(path, atomically: true) 

    var plistArray2 = NSArray(contentsOfFile: path) 

    for tempDict1 in plistArray2 { 
     var tempDict2: NSDictionary = tempDict1 as NSDictionary 
     var cityName: String = tempDict2.valueForKey("Name") as String 
     var cityZMV: String = tempDict2.valueForKey("ZMV") as String 
     var cityCountry: String = tempDict2.valueForKey("Country") as String 
     println("City: \(cityName), ZMV: \(cityZMV), Country: \(cityCountry)") 
    } 

A prima vista, tutto funziona bene. L'output è simile al seguente:

City: Moscow, ZMV: 00000.1.27612, Country: RU 
City: New York, ZMV: 10001.5.99999, Country: US 
City: TEST, ZMV: TEST, Country: TEST 

Ma quando interrompo l'applicazione, vedo che il mio file favCities.plist non è cambiata. Ci sono ancora due valori. Questi valori - City: TEST, ZMV: TEST, Country: TEST - non sono stati aggiunti. Se riavvio l'applicazione, vedo nuovamente 3 righe di output, anche se dovrebbe esserci 4.

Cosa c'è che non va?

aggiornamento:

mi è stato cambiato il codice per questo:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let fileManager = (NSFileManager.defaultManager()) 
    let directorys : [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.AllDomainsMask, true) as? [String] 

    if (directorys! != nil){ 
     let directories:[String] = directorys!; 
     let dictionary = directories[0]; 

     let plistfile = "favCities.plist" 
     let plistpath = dictionary.stringByAppendingPathComponent(plistfile); 

     println("\(plistpath)") 

     var plistArray = NSArray(contentsOfFile: plistpath) as [Dictionary<String, String>] 

     var addDic: Dictionary = ["ZMV": "TEST", "Name": "TEST", "Country": "TEST"] 
     plistArray += addDic 

     (plistArray as NSArray).writeToFile(plistpath, atomically: false) 

     var plistArray2 = NSArray(contentsOfFile: plistpath) 

     for tempDict1 in plistArray2 { 
      var tempDict2: NSDictionary = tempDict1 as NSDictionary 
      var cityName: String = tempDict2.valueForKey("Name") as String 
      var cityZMV: String = tempDict2.valueForKey("ZMV") as String 
      var cityCountry: String = tempDict2.valueForKey("Country") as String 
      println("City: \(cityName), ZMV: \(cityZMV), Country: \(cityCountry)") 
     } 
    } 
    else { 
     println("ERROR!") 
    } 

} 

Ora, quando si esegue l'applicazione il numero di righe negli aumenti di uscita:

City: Moscow, ZMV: 00000.1.27612, Country: RU 
City: New York, ZMV: 10001.5.99999, Country: US 
City: TEST, ZMV: TEST, Country: TEST 
City: TEST, ZMV: TEST, Country: TEST 
........ 

MA! Se si visualizza il file favCities.plist, che si trova nella cartella del progetto (Project Navigator in Xcode), rimane invariato - ci sono due righe!

Se passeggiata lungo il sentiero, che è memorizzato nella variabile plistpath-/Users/admin/Library/Developer/CoreSimulator/Devices/55FD9B7F-78F6-47E2-9874-AF30A21CD4A6/data/Containers/Data/Application/DEE6C3C8-6A44-4255-9A87-2CEF6082A63A/Documents/

Poi c'è un altro file di favCities.plist. Contiene tutte le modifiche che rendono l'applicazione. Che cosa sto facendo di sbagliato? Come posso vedere tutte le modifiche in un file che si trova nella cartella del progetto (Project Navigator)?

+2

valore di controllo ritorno del 'writeToFile', e vedrete che non è riuscita. perché i file nel bundle principale sono di sola lettura –

+1

possibili duplicati di [scrivere NSDictionary da plistare nel mio pacchetto di app] (http://stackoverflow.com/questions/2502193/writing-nsdictionary-to-plist-in-my-app-bundle) –

+2

(Quindi tutti gli errori tipici nelle applicazioni iOS che sono stati realizzati utilizzando Objective-C, ora vengono nuovamente creati utilizzando Swift :-) –

risposta

0

Sì, questo ha risolto il problema - Swift - Read plist

Ma plist-files nella cartella del progetto utilizza solo per la situazione patrimoniale-like .....

0

Se si guarda indietro a quanto velocemente o plist scrivere su chiave già esistenti in plist

var path = NSBundle.mainBundle().pathForResource("GameParam", ofType: "plist") 
    if var dict = NSMutableDictionary(contentsOfFile: path!) { 
     ToolKit.log(dict) 
     dict.setValue("blablabla", forKey: "keyInPlist") 

     dict.writeToFile(path!, atomically: false) 
    } 
0

per lo più, la gente vuole memorizzare un elenco di qualcosa, ecco la mia parte su come fare questo, anche, qui non copiare il file plist, ho appena creo . L'attuale salvataggio/caricamento è abbastanza simile alla risposta da Rebeloper

Xcode 7 beta, Swift 2,0

risparmio

func SaveItemFavorites(items : Array<ItemFavorite>) -> Bool 
{ 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let docuDir = paths.firstObject as! String 
    let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath) 
    let filemanager = NSFileManager.defaultManager() 

    let array = NSMutableArray()   

    for var i = 0 ; i < items.count ; i++ 
    { 
     let dict = NSMutableDictionary() 
     let ItemCode = items[i].ItemCode as NSString 

     dict.setObject(ItemCode, forKey: "ItemCode") 
     //add any aditional.. 
     array[i] = dict 
    } 

    let favoritesDictionary = NSDictionary(object: array, forKey: "favorites") 
    //check if file exists 
    if(!filemanager.fileExistsAtPath(path)) 
    { 
     let created = filemanager.createFileAtPath(path, contents: nil, attributes: nil) 
     if(created) 
     { 
      let succeeded = favoritesDictionary.writeToFile(path, atomically: true) 
      return succeeded 
     } 
     return false 
    } 
    else 
    { 
     let succeeded = notificationDictionary.writeToFile(path, atomically: true) 
     return succeeded 
    } 
} 

piccola nota dalla documentazione:

NSDictionary.writeToFile (percorso: atomicamente :)

Questo metodo convalida in modo ricorsivo che tutti gli oggetti contenuti sono oggetti elenco delle proprietà (istanze di NSData, NSDate, NSNumber, NSString, NSArray, o NSDictionary) prima di scrivere fuori il file, e non ha prodotto alcun se tutti gli oggetti non sono oggetti lista proprietà, poiché il file risultante non sarebbe un elenco di proprietà valido.

Quindi, qualunque cosa si imposta a dict.SetObject() dovrebbe essere uno dei tipi di cui sopra.

carico

private let ItemFavoritesFilePath = "ItemFavorites.plist" 

func LoadItemFavorites() -> Array<ItemFavorite> 
{ 
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray 
    let docuDir = paths.firstObject as! String 
    let path = docuDir.stringByAppendingPathComponent(ItemFavoritesFilePath) 
    let dict = NSDictionary(contentsOfFile: path) 
    let dictitems : AnyObject? = dict?.objectForKey("favorites") 

    var favoriteItemsList = Array<ItemFavorite>() 

    if let arrayitems = dictitems as? NSArray 
    { 
     for var i = 0;i<arrayitems.count;i++ 
     { 
      if let itemDict = arrayitems[i] as? NSDictionary 
      { 
       let ItemCode = itemDict.objectForKey("ItemCode") as? String 
       //get any additional 

       let ItemFavorite = ItemFavorite(item: ItemCode) 
       favoriteItemsList.append(ItemFavorite) 
      } 
     } 
    } 

    return favoriteItemsList 
}