Mam przykładowy plik plist, favCities.plist. To jest mój przykładowy kod:Zapis do pliku plist w 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)")
}
Na pierwszy rzut oka wszystko działa dobrze. Wyjście wygląda następująco:
City: Moscow, ZMV: 00000.1.27612, Country: RU
City: New York, ZMV: 10001.5.99999, Country: US
City: TEST, ZMV: TEST, Country: TEST
Ale kiedy przerwać aplikację, widzę, że mój plik favCities.plist nie uległa zmianie. Nadal istnieją dwie wartości. Te wartości - City: TEST, ZMV: TEST, Country: TEST
- nie zostały dodane. Jeśli ponownie uruchomię aplikację, znowu widzę 3 linie wyjściowe, chociaż powinno być 4.
Co jest nie tak?
AKTUALIZACJA:
I został zmieniony kod do tego:
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!")
}
}
Teraz po uruchomieniu aplikacji liczbę wierszy wzrasta wyjściowych:
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
........
ALE! Jeśli przeglądasz plik favCities.plist, który znajduje się w folderze projektu (Project Navigator w Xcode), pozostaje on niezmieniony - są dwie linie!
Jeśli spacer wzdłuż ścieżki, która jest przechowywana w zmiennej plistpath
- /Users/admin/Library/Developer/CoreSimulator/Devices/55FD9B7F-78F6-47E2-9874-AF30A21CD4A6/data/Containers/Data/Application/DEE6C3C8-6A44-4255-9A87-2CEF6082A63A/Documents/
Potem jest jeszcze jeden plik favCities.plist. Zawiera wszystkie zmiany, które składają się na aplikację. Co ja robię źle? Jak mogę zobaczyć wszystkie zmiany w pliku znajdującym się w folderze projektu (Project Navigator)?
wartość zwracana sprawdzenie 'writeToFile', a zobaczysz, że nie powiodła się. ponieważ pliki w głównym pakiecie są tylko do odczytu –
możliwe duplikaty [pisania NSDictionary do plist w moim pakiecie aplikacji] (http://stackoverflow.com/questions/2502193/writing-nsdictionary-to-plist-in-my-app-bundle) –
(Tak więc wszystkie typowe błędy w aplikacjach iOS, które były kiedyś wykonane przy użyciu Objective-C, są teraz ponownie tworzone za pomocą Swift :-) –