Écrire dans un fichier plist dans Swift
J'ai un échantillon plist-fichier, favCities.plist. C'est mon exemple de code:
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)")
}
Au premier coup d'œil, tout fonctionne bien. La sortie ressemble à ceci:
City: Moscow, ZMV: 00000.1.27612, Country: RU
City: New York, ZMV: 10001.5.99999, Country: US
City: TEST, ZMV: TEST, Country: TEST
Mais quand je l'interruption de l'application, je vois que mon fichier favCities.plist n'a pas changé. Il y a encore deux valeurs. Ces valeurs - City: TEST, ZMV: TEST, Country: TEST
- n'ont pas été ajoutés. Si j'ai redémarré l'application, puis de nouveau je vois 3 lignes de sortie, mais il faudrait être 4.
Quel est le problème?
Mise à JOUR:
J'ai été changé de code:
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!")
}
}
Maintenant, lorsque vous exécutez l'application, le nombre de lignes de la hausse de la production:
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
........
MAIS! Si l'option afficher le fichier favCities.plist qui se trouve dans le dossier du projet (Project Navigator dans Xcode), il reste inchangé - il y a deux lignes!
Si marcher le long du chemin, qui est stocké dans la variable plistpath
- /Users/admin/Library/Developer/CoreSimulator/Devices/55FD9B7F-78F6-47E2-9874-AF30A21CD4A6/data/Containers/Data/Application/DEE6C3C8-6A44-4255-9A87-2CEF6082A63A/Documents/
Puis il y a un autre fichier favCities.plist. Il contient toutes les modifications qui en font la demande. Ce que je fais mal? Comment puis-je voir tous les changements dans un fichier qui se trouve dans le dossier du projet (Project Navigator)?
writeToFile
, et vous verrez qu'elle a échoué. parce que les fichiers dans les principales bundle sont en lecture seuledouble possible de l'écriture NSDictionary à plist dans mon app bundle
(Donc, toutes les erreurs typiques dans les applications iOS qui ont été faites à l'aide Objective-C, le sont maintenant à nouveau en utilisant Swift 🙂
Ou plist-les fichiers dans le dossier du projet besoins que pour la première utilisation (comme les propriétés, etc.)?
OriginalL'auteur Alexey Nakhimov | 2014-07-11
Vous devez vous connecter pour publier un commentaire.
Oui, cela a résolu le problème - Swift - Lire plist
Mais plist-les fichiers dans le dossier de projet utilise uniquement pour les biens-comme situation.....
OriginalL'auteur Alexey Nakhimov
Pour la plupart, les gens veulent stocker une liste de quelque chose, donc voici mon partage sur comment faire cela, aussi, ici je n'ai pas copier le fichier plist, je viens de créer. Les économies réelles, le chargement est assez similaire à la réponse de Rebeloper
xcode 7 beta, Swift 2.0
économie
Petite note à partir de la documentation:
Donc, tout ce que vous définissez lors de la
dict.SetObject()
devrait être l'un des types mentionnés ci-dessus.chargement
OriginalL'auteur CularBytes