Contents

fileExporter(isPresented:item:contentTypes:defaultFilename:onCompletion:onCancellation:)

Presents a system dialog allowing the user to export a Transferable item to a file on disk.

Declaration

nonisolated func fileExporter<T>(isPresented: Binding<Bool>, item: T?, contentTypes: [UTType] = [], defaultFilename: String? = nil, onCompletion: @escaping (Result<URL, any Error>) -> Void, onCancellation: @escaping () -> Void = { }) -> some View where T : Transferable

Parameters

  • isPresented:

    A binding to whether the dialog should be shown.

  • item:

    The item to be saved on disk.

  • contentTypes:

    The optional content types to use for the exported file. If empty, SwiftUI uses the content types from the transferRepresentation property provided for Transferable conformance.

  • defaultFilename:

    If provided, the default name to use for the exported file, which the user will have an opportunity to edit prior to the export.

  • onCompletion:

    A callback that will be invoked when the operation has succeeded or failed.

  • onCancellation:

    A callback that will be invoked if the user cancels the operation.

Discussion

In order for the dialog to appear, isPresented must be set to true. 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.

For example, a button that exports a photo might look like this:

struct ExportPhotoButton: View {
    @State private var isExporterPresented = false
    var photo: Photo

    var body: some View {
        Button("Export Photo") {
            isExporterPresented = true
        }
        .fileExporter(
            isPresented: $isExporterPresented,
            item: photo,
            defaultFilename: "exported photo"
        ) { result in
            switch result {
            case .success(let url):
                print("Saved to \(url)")
            case .failure(let error):
                print(error)
            }
        } onCancellation: {
            print("Export cancelled")
        }
    }
}

struct Photo: Transferable { ... }

To further configure the dialog’s appearance and behavior, use these view modifiers: fileDialogDefaultDirectory(_:), fileDialogConfirmationLabel(_:), fileDialogMessage(_:), fileDialogBrowserOptions(_:), fileExporterFilenameLabel(_:), and fileDialogCustomizationID(_:).

See Also

Exporting to file