在 swift 2.1 中写入/读取 Plist
Write/ read Plist in swift 2.1
正在尝试将 addObject 保存到 plist
中的数组,但不知道该怎么做...
Plist的结构如下:
<?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>
这是我用的:
从 Documents 目录读取 plist 工作正常....
在我看来DidLoad
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
在我的保存函数中:
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)
但是我的plist里好像什么都没写...
谢谢。
这似乎对我有用:
你觉得这样对吗?
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)
而不是简单的 NSDictionary(contentsOfURL: fileURL)
我建议使用 NSPropertyListSerialization
class。
由于Swift的值类型语义,您需要在更改其中一个数组后更新根字典,例如
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)
}
正在尝试将 addObject 保存到 plist
中的数组,但不知道该怎么做...
Plist的结构如下:
<?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>
这是我用的:
从 Documents 目录读取 plist 工作正常.... 在我看来DidLoad
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
在我的保存函数中:
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)
但是我的plist里好像什么都没写...
谢谢。
这似乎对我有用: 你觉得这样对吗?
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)
而不是简单的 NSDictionary(contentsOfURL: fileURL)
我建议使用 NSPropertyListSerialization
class。
由于Swift的值类型语义,您需要在更改其中一个数组后更新根字典,例如
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)
}