ios - Bundle.main.url 无法找到使用 PropertyListSerialization 保存的 plist
问题描述
我正在读取和写入plist
,但两个进程之一不起作用。
阅读
var data: [String: Int] = [:]
if let url = Bundle.main.url(forResource: "Calendar", withExtension: "plist") {
do {
print("url: \(url)")
let dataContent = try Data(contentsOf: url)
if let dict = try PropertyListSerialization.propertyList(from: dataContent, format: nil) as? [String: Int] {
data = dict
}
} catch {
print(error)
}
}
url
这里没有被打印,这意味着Bundle.main.url
要么无法定位,要么Calendar.plist
没有正确保存。
写作
do {
let path = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("Calendar.plist")
let plistData = try PropertyListSerialization.data(fromPropertyList: data, format: .xml, options: 0)
try plistData.write(to: path)
} catch {
print(error)
}
data
是["test": 1]
暂定的。
解决方案
这是你正在做的事情:
- 阅读时,您
Calendar.plist
从应用程序的捆绑包根文件夹中读取您的内容。 - 写入时,您将您
Calendar.plist
的写入应用程序的捆绑Documents
文件夹。
由于应用程序的捆绑根文件夹(从您正在阅读的位置)对您来说是不可写的,因此您的正确位置Calendar.plist
是Documents
文件夹,并且您应该以与写入时相同的方式为其创建 URL 或路径,更好在您从读取和写入例程中调用的专用吸气剂中。
func calendarURL() -> URL? {
guard let result = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("Calendar.plist") else { return nil }
return result
}
阅读
var data: [String: Int] = [:]
if let url = calendarURL() {
...
写作
if let path = calendarURL() {
do {
let plistData = try PropertyListSerialization.data(fromPropertyList: data, format: .xml, options: 0)
...
推荐阅读
- tsql - 我不了解 OPENQUERY 函数
- typescript - 除非在我执行 yarn start 时提供了“--jsx”标志,否则无法使用 JSX
- java - 如何引导构建 jdk?
- php - wordpress 登录 wp-login.php 更改网址
- javascript - 如何用 span 标签替换部分字符串?
- loops - while循环中的动态“修改”子句
- laravel - Laravel 7.4:无法在服务器上上传徽标
- javascript - 根据类名Javascript更改伪元素的颜色
- angular - Angular Material Mat-Menu 在打开之前不会检查可用空间,并会切断
- python-3.x - Python3:比较两个 CSV 文件以识别新文件中的新内容,忽略旧文件中的内容