将数据保存到Swift中的.plist文件
我试图快速地将数据保存到plist文件中,但数据没有显示出来,因为当plist被读取时它被保存了。 这是我正在使用的代码。
var documentsDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString var path : NSString = documentsDirectory.stringByAppendingPathComponent("data.plist") var data : NSMutableDictionary = NSMutableDictionary(contentsOfFile: path) data.setObject(self.object, forKey: "key") data.writeToFile(path, atomically: true)
编辑:我听说最好的办法是写入文档目录,所以我的问题是如何写入该目录中的文件?
显然该文件不在可写位置,所以我在文档目录中创build了它。
var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String var path = paths.stringByAppendingPathComponent("data.plist") var fileManager = NSFileManager.defaultManager() if (!(fileManager.fileExistsAtPath(path))) { var bundle : NSString = NSBundle.mainBundle().pathForResource("data", ofType: "plist") fileManager.copyItemAtPath(bundle, toPath: path, error:nil) } data.setObject(object, forKey: "object") data.writeToFile(path, atomically: true)
然后,它必须从文档目录中读取。
var paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String var path = paths.stringByAppendingPathComponent("data.plist") let save = NSDictionary(contentsOfFile: path)
Swift 3:
func loadData() { let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray let documentDirectory = paths[0] as! String let path = documentDirectory.appending("myData.plist") let fileManager = FileManager.default if(!fileManager.fileExists(atPath: path)){ if let bundlePath = Bundle.main.path(forResource: "myData", ofType: "plist"){ let result = NSMutableDictionary(contentsOfFile: bundlePath) print("Bundle file myData.plist is -> \(result?.description)") do{ try fileManager.copyItem(atPath: bundlePath, toPath: path) }catch{ print("copy failure.") } }else{ print("file myData.plist not found.") } }else{ print("file myData.plist already exits at path.") } let resultDictionary = NSMutableDictionary(contentsOfFile: path) print("load myData.plist is ->\(resultDictionary?.description)") let myDict = NSDictionary(contentsOfFile: path) if let dict = myDict{ myItemValue = dict.object(forKey: myItemKey) as! String? txtValue.text = myItemValue }else{ print("load failure.") } }
快速读写plist文件
使用writeToFile:options:error:并查看错误说的是什么:
var error: NSError? var bytes = NSKeyedArchiver.archivedDataWithRootObject(data) if !bytes.writeToFile(path, options: nil, error: &error) { if let actualError = error { println(actualError) } }
更新的Rebeloper的Swift代码:
let BedroomFloorKey = "BedroomFloor" let BedroomWallKey = "BedroomWall" var bedroomFloorID: AnyObject = 101 var bedroomWallID: AnyObject = 101 func saveGameData() { let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray let documentsDirectory = paths.objectAtIndex(0) as! NSString let path = documentsDirectory.stringByAppendingPathComponent("GameData.plist") let dict: NSMutableDictionary = ["XInitializerItem": "DoNotEverChangeMe"] //saving values dict.setObject(bedroomFloorID, forKey: BedroomFloorKey) dict.setObject(bedroomWallID, forKey: BedroomWallKey) //... //writing to GameData.plist dict.writeToFile(path, atomically: false) let resultDictionary = NSMutableDictionary(contentsOfFile: path) print("Saved GameData.plist file is --> \(resultDictionary?.description)") self.loadGameData() }//eom func loadGameData() { // getting path to GameData.plist let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray let documentsDirectory = paths[0] as! NSString let path = documentsDirectory.stringByAppendingPathComponent("GameData.plist") // let path = documentsDirectory.stringByAppendingPathComponent("GameData.plist") let fileManager = NSFileManager.defaultManager() //check if file exists if(!fileManager.fileExistsAtPath(path)) { // If it doesn't, copy it from the default file in the Bundle if let bundlePath = NSBundle.mainBundle().pathForResource("GameData", ofType: "plist") { let resultDictionary = NSMutableDictionary(contentsOfFile: bundlePath) print("Bundle GameData.plist file is --> \(resultDictionary?.description)") do { try fileManager.copyItemAtPath(bundlePath, toPath: path) print("copy") } catch _ { print("error failed loading data") } } else { print("GameData.plist not found. Please, make sure it is part of the bundle.") } } else { print("GameData.plist already exits at path.") // use this to delete file from documents directory //fileManager.removeItemAtPath(path, error: nil) } let resultDictionary = NSMutableDictionary(contentsOfFile: path) print("Loaded GameData.plist file is --> \(resultDictionary?.description)") let myDict = NSDictionary(contentsOfFile: path) if let dict = myDict { //loading values bedroomFloorID = dict.objectForKey(BedroomFloorKey)! bedroomWallID = dict.objectForKey(BedroomWallKey)! //... } else { print("WARNING: Couldn't create dictionary from GameData.plist! Default values will be used!") } }//eom
struct Plist { enum PlistError: ErrorType { case FileNotWritten case FileDoesNotExist } let name:String var sourcePath:String? { guard let path = NSBundle.mainBundle().pathForResource(name, ofType: "plist") else { return .None } return path } var destPath:String? { guard sourcePath != .None else { return .None } let dir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] return (dir as NSString).stringByAppendingPathComponent("\(name).plist") } init?(name:String) { self.name = name let fileManager = NSFileManager.defaultManager() guard let source = sourcePath else { return nil } guard let destination = destPath else { return nil } guard fileManager.fileExistsAtPath(source) else { return nil } if !fileManager.fileExistsAtPath(destination) { do { try fileManager.copyItemAtPath(source, toPath: destination) } catch let error as NSError { print("Unable to copy file. ERROR: \(error.localizedDescription)") return nil } } } func getValuesInPlistFile() -> NSDictionary?{ let fileManager = NSFileManager.defaultManager() if fileManager.fileExistsAtPath(destPath!) { guard let dict = NSDictionary(contentsOfFile: destPath!) else { return .None } return dict } else { return .None } } func getMutablePlistFile() -> NSMutableDictionary?{ let fileManager = NSFileManager.defaultManager() if fileManager.fileExistsAtPath(destPath!) { guard let dict = NSMutableDictionary(contentsOfFile: destPath!) else { return .None } return dict } else { return .None } } func addValuesToPlistFile(dictionary:NSDictionary) throws { let fileManager = NSFileManager.defaultManager() if fileManager.fileExistsAtPath(destPath!) { if !dictionary.writeToFile(destPath!, atomically: false) { print("File not written successfully") throw PlistError.FileNotWritten } } else { throw PlistError.FileDoesNotExist } } }
现在,在你的视图控制器下面实现。
if let plist = Plist(name: "plist file name") { let dict = plist.getMutablePlistFile()! dict["key"] = value do { try plist.addValuesToPlistFile(dict) } catch { print(error) } print(plist.getValuesInPlistFile()) } else { print("Unable to get Plist") }