fileExporter(isPresented:documents:contentTypes:onCompletion:onCancellation:)
Presents a system dialog for allowing the user to export a collection of objects conforming to WritableDocument to files on disk.
Declaration
nonisolated func fileExporter<C>(isPresented: Binding<Bool>, documents: C, contentTypes: [UTType] = [], onCompletion: @escaping (Result<[URL], any Error>) -> Void, onCancellation: (() -> Void)? = nil) -> some View where C : Collection, C.Element : WritableDocument, C.Element.Writer.Destination == URL
Parameters
- isPresented:
A binding to whether the dialog should be shown.
- documents:
The in-memory documents to export.
- contentTypes:
The content types to export to. If not provided,
WritableDocument.writableContentTypesare used. - onCompletion:
A callback that will be invoked when the operation has succeeded or failed. The
resultindicates whether the operation succeeded or failed. - onCancellation:
A callback that will be invoked if the user cancels the operation.
Discussion
In order for the dialog to appear, documents must be non-empty. When the operation is finished, isPresented will be set to false before onCompletion is called. If the user cancels the operation, isPresented will be set to false and onCancellation will be called.
@MainActor
final class TextDocument: WritableDocument {
static let writableContentTypes: [UTType] = [.utf8PlainText]
var text: String = ""
nonisolated func writer(
configuration: sending WriteConfiguration
) -> sending FileWrapperDocumentWriter<String> {
FileWrapperDocumentWriter(configuration) { snapshot, _ in
FileWrapper(regularFileWithContents: Data(snapshot.utf8))
}
}
func snapshot(contentType: UTType) async throws -> String {
text
}
}
struct ExportView: View {
@Binding var documents: [TextDocument]
@State private var isExporting = false
var body: some View {
Button("Export…") { isExporting = true }
.fileExporter(
isPresented: $isExporting,
documents: documents
) { _ in }
}
}See Also
Exporting to file
fileExporter(isPresented:document:contentType:defaultFilename:onCompletion:)fileExporter(isPresented:documents:contentType:onCompletion:)fileExporter(isPresented:document:contentType:defaultFilename:onCompletion:onCancellation:)fileExporter(isPresented:document:contentTypes:defaultFilename:onCompletion:onCancellation:)fileExporter(isPresented:item:contentTypes:defaultFilename:onCompletion:onCancellation:)fileExporter(isPresented:items:contentTypes:onCompletion:onCancellation:)fileExporterFilenameLabel(_:)