【发布时间】:2014-09-01 18:50:12
【问题描述】:
我有一个示例 plist 文件,favCities.plist。这是我的示例代码:
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)")
}
乍一看,一切正常。输出如下所示:
City: Moscow, ZMV: 00000.1.27612, Country: RU
City: New York, ZMV: 10001.5.99999, Country: US
City: TEST, ZMV: TEST, Country: TEST
但是当我中断应用程序时,我看到我的文件 favCities.plist 没有改变。仍然有两个值。这些值 - City: TEST, ZMV: TEST, Country: TEST - 没有添加。如果我重新启动应用程序,我会再次看到 3 行输出,尽管应该有 4 行。
怎么了?
更新:
我把代码改成了这样:
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!")
}
}
现在,当您运行应用程序时,输出中的行数会增加:
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
........
但是!如果查看位于项目文件夹(Xcode 中的 Project Navigator)中的文件 favCities.plist,它仍然保持不变 - 有两行!
如果沿着路径走,它存储在变量plistpath - /Users/admin/Library/Developer/CoreSimulator/Devices/55FD9B7F-78F6-47E2-9874-AF30A21CD4A6/data/Containers/Data/Application/DEE6C3C8-6A44-4255-9A87-2CEF6082A63A/Documents/中
然后还有一个文件favCities.plist。它包含构成应用程序的所有更改。我究竟做错了什么?如何查看位于项目文件夹(Project Navigator)中的文件中的所有更改?
【问题讨论】:
-
检查
writeToFile的返回值,你会看到它失败了。因为主包中的文件是只读的 -
(因此,iOS 应用程序中曾经使用 Objective-C 出现的所有典型错误,现在都使用 Swift 再次出现 :-)
-
或者项目文件夹中的plist-files只需要初始使用(比如属性等)?
标签: swift nsdictionary plist ios8