SwiftUI 中如何实现文件导入和导出

前言

之前谈论了在 SwiftUI 中选择照片和视频的问题。今天我们将学习如何在 SwiftUI 视图中导入和导出文件。通过使用新的 fileImporter 和 fileExporter 视图修饰符,可以很方便实现这个功能。

导入

SwiftUI 框架提供了 fileImporter 视图修饰符,可以轻松启用文件选择功能。完全处理对话框和文件夹之间的导航。接下来让我们看看如何实现。

struct ImportingExampleView: View {
    @State private var importing = false
    
    var body: some View {
        Button("Import") {
            importing = true
        }
        .fileImporter(
            isPresented: $importing,
            allowedContentTypes: [.plainText]
        ) { result in
            switch result {
            case .success(let file):
                print(file.absoluteString)
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }
}

如上面的示例所示,我们将 fileImporter 视图修饰符附加到一个按钮上,该按钮切换导入属性,使用它作为绑定来启用文件选择功能。还使用 fileImporter 视图修饰符上的 allowedContentTypes 参数传递允许的文件类型数组。在完成闭包中,可以处理结果并提取所选文件的 URL。

导出

文件导出的工作方式非常相似,但我们还应该提供要导出的文档。在这种情况下,文档类型应符合 FileDocument 协议。

struct TextDocument: FileDocument {
    static var readableContentTypes: [UTType] {
        [.plainText]
    }
    
    var text = ""
    
    init(text: String) {
        self.text = text
    }
    
    init(configuration: ReadConfiguration) throws {
        if let data = configuration.file.regularFileContents {
            text = String(decoding: data, as: UTF8.self)
        } else {
            text = ""
        }
    }
    
    func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
        FileWrapper(regularFileWithContents: Data(text.utf8))
    }
}

在上面的示例中,我们定义了符合 FileDocument 协议的 TextDocument 类型。正如示例所见,实现了从文件读取纯文本并允许将字符串数据导出到文件。现在,可以使用 fileExporter 视图修饰符导出 TextDocument 类型的实例。

struct ExportingExampleView: View {
    @State private var exporting = false
    @State private var document = TextDocument(text: "")
    

    var body: some View {

        TextEditor(text: $document.text)
            .toolbar {
                Button("Export") {
                    exporting = true
                }
                .fileExporter(
                    isPresented: $exporting,
                    document: document,
                    contentType: .plainText
                ) { result in
                    switch result {
                    case .success(let file):
                        print(file)
                    case .failure(let error):
                        print(error)
                    }
                }
            }
    }
}

如上面的示例所示,使用 fileExporter 视图修饰符来启用文件导出的用户体验。还需要绑定到一个布尔值以呈现对话框。必须传递要导出的文档以及其内容类型。在完成闭包中,可以验证文档是否被正确导出,或检查失败的原因。

文件移动

作为额外的功能,SwiftUI 框架还为我们提供了 fileMover 视图修饰符,为用户提供了文件移动的体验。

struct MovingExampleView: View {
    @State private var moving = false
    let file: URL
    

    var body: some View {

        Button("Move files") {
            moving = true
        }
        .fileMover(isPresented: $moving, file: file) { result in
            switch result {
            case .success(let file):
                print(file.absoluteString)
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }
}

在上面的示例中,使用了 fileMover 视图修饰符向用户展示文件移动对话框。应该传递要移动的文件 URL,并在完成闭包中验证结果。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYnkZCuk' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片