swift - SWIFT 写入 plist 未更新
问题描述
我正在尝试写信给plist
我,我正在使用两种方法,但它们都不适合我。
我没有收到任何错误,当我打印时paths
我可以看到它plist
存在,但是您可以从屏幕截图中看到plist
它没有得到更新/填充。
let path = Bundle.main.path(forResource: "Employee", ofType: "plist")!
let data : NSDictionary =
["A": [["userid":"1","username":"AAA","usergroupid":"2"], ["userid":"33","username":"ABB","usergroupid":"8"]],
"B": [["userid":"2","username":"BBB","usergroupid":"8"], ["userid":"43","username":"ABC","usergroupid":"8"]] ]
//first approach
let favoritesDictionary = NSDictionary(object: data, forKey: ("Favorites" as NSString?)!)
print(path)
let succeeded = favoritesDictionary.write(toFile: path, atomically: true)
//second approach
let bundlePath = Bundle.main.path(forResource: "Employee", ofType: "plist")!
print(bundlePath)
let dictionary = NSMutableDictionary(contentsOfFile: bundlePath)
dictionary?.setObject(data, forKey: ("Locations" as NSString?)!)
dictionary?.write(toFile: bundlePath, atomically: true)
有人可以帮忙吗?
解决方案
这是一个简短的教程。
创建您的 plist 文件并将其放入应用程序包中。
在
AppDelegate
创建计算属性以获取当前Documents
文件夹并附加文件路径var employeePlistURL : URL { let documentsFolderURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] return documentsFolderURL.appendingPathComponent("Employee.plist") }
为标志
AppDelegate
applicationWillFinishLaunching
注册一个键值对,如果标志为真,则将 plist 复制到文档文件夹中firstLaunch
UserDefaults
func applicationWillFinishLaunching(_ aNotification: Notification) { let defaults = UserDefaults.standard defaults.register(defaults: ["firstLaunch":true]) if defaults.bool(forKey: "firstLaunch") { let sourceFile = Bundle.main.url(forResource: "Employee", withExtension: "plist")! try? FileManager.default.copyItem(at: sourceFile, to: employeePlistURL) defaults.set(false, forKey: "firstLaunch") } }
无论您需要在何处读取和写入属性列表,还可以创建计算属性并为字典添加一个属性
var employees = [String:Any]()
以及两种加载和保存数据的方法
func loadEmployees() { do { let data = try Data(contentsOf: employeePlistURL) guard let plist = try PropertyListSerialization.propertyList(from: data, format: nil) as? [String:Any] else { return } employees = plist } catch { print(error) } } func saveEmployees() { do { let data = try PropertyListSerialization.data(fromPropertyList: employees, format: .binary, options: 0) try data.write(to: employeePlistURL) } catch { print(error) } }
更好的方法是使用结构,PropertyListEncoder/-Decoder
但是由于问题中的文字字典和屏幕截图有很大不同,我提供了 common Dictionary
/PropertyListSerialization
方式。
推荐阅读
- angular-universal - 如何等待角型万能器充满电?
- autodesk-forge - 当我按原样复制和粘贴部分时,为什么 forgeSample 会出现错误?
- html - 如何垂直对齐展开手风琴的CSS箭头?
- php - PHP函数不显示下拉菜单中的数据
- ms-access - Microsoft Access 子表单搜索组合框
- r - 在 R 中使用 ggplot 2 将 y 轴线更改为 x = 0
- c# - 实例变量与 getter/setter
- python - Ansible 无法从 MACOS(源机器)ping Windows 主机
- javascript - 从子类访问父类中的状态
- vba - 如何从 Access 数据集创建 2D 可视化