fileMover(isPresented:files:onCompletion:onCancellation:)
Presents a system dialog for allowing the user to move a collection of existing files to a new location.
Declaration
nonisolated func fileMover<C>(isPresented: Binding<Bool>, files: C, onCompletion: @escaping (Result<[URL], any Error>) -> Void, onCancellation: @escaping () -> Void) -> some View where C : Collection, C.Element == URL
Parameters
- isPresented:
A binding to whether the dialog should be shown.
- files:
A collection of URLs for the files to be moved.
- onCompletion:
A callback that will be invoked when the operation has succeeded or failed. The
resultindicates whether the operation succeeded or failed. To access the received URLs, callstartAccessingSecurityScopedResource. When the access is no longer required, callstopAccessingSecurityScopedResource. - onCancellation:
A callback that will be invoked if the user cancels the operation.
Discussion
For example, a button that allows the user to move files might look like this:
struct MoveFilesButton: View {
@Binding var files: [URL]
@State private var showFileMover = false
var onCompletion: (URL) -> Void
var onCancellation: (() -> Void)?
var body: some View {
Button {
showFileMover = true
} label: {
Label("Choose destination", systemImage: "folder.circle")
}
.fileMover(isPresented: $showFileMover, files: files) { result in
switch result {
case .success(let urls):
urls.forEach { url in
guard url.startAccessingSecurityScopedResource() else {
return
}
onCompletion(url)
url.stopAccessingSecurityScopedResource()
}
case .failure(let error):
print(error)
// handle error
}
} onCancellation: {
onCancellation?()
}
}
}