前语
之前议论了在 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,并在完结闭包中验证结果。