1

我正在尝试编写一个相当简单的基于 UIDocument 的应用程序,并且我希望每个文档的数据都是包含一些图像文件的父目录。开始时我选择使用 Apple 的 ShapeEdit 示例,因为它似乎可以处理在 iCloud 中保存文件的许多复杂性。它只使用一个 plist 文件作为它的文档数据。

作为第一步,我在 iPad 上启动并运行 ShapeEdit 应用程序,一切都按预期工作。我的应用程序和 iCloud Drive 应用程序在我的 iPad 上以拆分视图运行,因此我可以看到 ShapeEdit 正在创建的文件。正如预期的那样,每次我添加一个新文档时,iCloud Drive 中都会出现一个新文件。

为了迁移 ShapeEdit 应用程序以使用更多文件,我转而使用 NSFileWrapper。当 ShapeEdit 创建一个新文档时,它会复制一个模板文件。我将其更改为仅使用创建一个新文件夹

try fileManager.createDirectoryAtURL(writeIntent.URL, withIntermediateDirectories: false, attributes: nil)

然后我修改了 UIDocument 代码,让它像这样从 NSFileWrapper 中读取

override func loadFromContents(contents: AnyObject, ofType typeName: String?) throws {
        guard let data = contents as? NSFileWrapper else {
            fatalError("Cannot handle contents of type \(contents.dynamicType).")
        }

        fileWrapper = data

我还阻碍了文档中的其他一些函数,以返回一个简单的缩略图图像,只是为了让它运行并将 LSTypeIsPackage 设置为 true。最后,我将形状选择 UI 留在那里以触发文档更新

updateChangeCount(.Done)

同样,这一切都很好。创建一个新文档会创建一个名为 Untitled.shapeFile 的新目录,它会显示在 iCloud 中。现在是奇怪的第一件事。如果我打开该文档并点击形状选择 UI 以触发更改并等待几秒钟,则会在 iCloud 中显示另一个 Untitled.shapeFile 目录。事实上,每次我这样做时,我都会得到另一个。尽管我的 Mac 上的 iCloud 只有一个副本,但这些似乎只在 iPad 本地。在 iCloud Drive 应用程序中删除这些目录中的任何一个都会导致它们全部被删除。

对于下一步,我向 UIDocument loadFromContents() 函数添加了一些代码

fileWrapper?.addRegularFileWithContents(UIImagePNGRepresentation(image!)!, preferredFilename: "MYImage.png")

所以每次加载文档时,都会将另一个图像文件添加到父目录。

首先,正如我所希望的那样。打开文档,点击形状选择 UI,看到 MyImage.png 文件出现在 iCloud Drive 中的 Untitled.shapeFile 中。继续关闭和打开,我会得到更多 MyImage.png 文件,前面有一些垃圾,我认为这是 iCloud 防止同名文件的方式,所以一切都很好。除了第二个奇怪的东西。在 iCloud Drive 中显示 MYImage.png 文件后不久,会弹出另一个名为 MyImage 2.png 的文件。如果我继续关闭和打开 MyImage 的所有版本,也会得到一个带有 2 的副本。我编辑的 ShapeEdit 版本从不添加任何具有这种名称格式的图像文件。这些额外的图像也确实出现在 mac 上,因此它们与主文档目录不同。

所以有两件事

1) 为什么我得到多个 Untitled.shapeFile 文档的副本,它们似乎实际上是同一件事?

2)为什么我会得到我的图像文件的额外副本,其中添加了 2,而我的应用程序从未与我有任何关系?

在这让我大吃一惊之前,欢迎提出任何建议。

4

0 回答 0