用于包文档的 SwiftUI 文件导出器

问题描述 投票:0回答:1

虽然我可以使用

fileExporter()
修饰符导出内存中文档,即单个文件文档(
.txt
.jpg
,...),也可以用于自定义文件类型(在项目中注册它们之后)设置具有特定的
UTType
),我不知道如何使用该修饰符来导出/保存包文档。

我有一个统一的 iOS/macOS 应用程序,除了用户选择的文件之外,还使用

project.json
。 我的自定义包文档文件夹看起来像这样:

/Users/xyz/somefolder/MyAppFile.myfile
----- project.json
----- file001.mp4
----- file002.jpg
----- file003.mp3
----- etc, etc...

FileDocument
协议在保存时要求
Data
,当您需要导出单个文件时这是正确的,但当您需要在正常应用程序使用期间保存和复制文件的文件夹时则不正确。

ios macos swiftui
1个回答
0
投票

fileWrapper(configuration:)
实现中,使用
FileWrapper
 创建一个 
init(directoryWithFileWrappers:)
。这将创建一个代表目录的
FileWrapper

例如,这是

FileDocument
的一个非常简单的实现:

struct MyFile: FileDocument {
    init() {}
    
    init(configuration: ReadConfiguration) throws {
        
    }
    
    func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
        FileWrapper(directoryWithFileWrappers: [
            "package.json": FileWrapper(
                regularFileWithContents: """
                    { "some key": "some value" }
                    """.data(using: .utf8)!
            ),
            "foo.txt": FileWrapper(
                regularFileWithContents: """
                    Lorem Ipsum
                    """.data(using: .utf8)!
            ),
        ])
    }
    
    static let readableContentTypes: [UTType] =
    [.init(exportedAs: "your.exported.uttype.identifier", conformingTo: .package)]
    
}

导出此文件将创建一个包含两个文件的包 - package.json 和 foo.txt。

.fileExporter
的用法示例:

@State var presented = false
var body: some View {
    Button("Export") {
        presented = true
    }.fileExporter(isPresented: $presented, document: MyFile(), defaultFilename: "Foo") { _ in
        // ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.