1 | fileExporter ( isPresented : document : contentType : defaultFilename : onCompletion :) |
Presents a system interface for allowing the user to export an in-memory document to a file on disk.
Example:
ContentView.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | import SwiftUI import UniformTypeIdentifiers struct ContentView : View { @State private var document : MessageDocument = MessageDocument ( message : "Hello, World!" ) @State private var isImporting : Bool = false @State private var isExporting : Bool = false var body : some View { VStack { GroupBox ( label : Text ( "Message:" )) { TextEditor ( text : $ document . message ) } GroupBox { HStack { Spacer () Button ( action : { isImporting = false //fix broken picker sheet DispatchQueue . main . asyncAfter ( deadline : . now () + 0.1 ) { isImporting = true } }, label : { Text ( "Import" ) }) Spacer () Button ( action : { isExporting = false //fix broken picker sheet DispatchQueue . main . asyncAfter ( deadline : . now () + 0.1 ) { isExporting = true } }, label : { Text ( "Export" ) }) Spacer () } } } . padding () . fileImporter ( isPresented : $ isImporting , allowedContentTypes : [ UTType . plainText ], allowsMultipleSelection : false ) { result in do { guard let selectedFile : URL = try result . get (). first else { return } //trying to get access to url contents if ( CFURLStartAccessingSecurityScopedResource ( selectedFile as CFURL )) { guard let message = String ( data : try Data ( contentsOf : selectedFile ), encoding : . utf8 ) else { return } document . message = message //done accessing the url CFURLStopAccessingSecurityScopedResource ( selectedFile as CFURL ) } else { print ( "Permission error!" ) } } catch { // Handle failure. print ( error . localizedDescription ) } } . fileExporter ( isPresented : $ isExporting , document : document , contentType : UTType . plainText , defaultFilename : "Message" ) { result in if case . success = result { // Handle success. } else { // Handle failure. } } } } |
MessageDocument.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import SwiftUI import UniformTypeIdentifiers struct MessageDocument : FileDocument { static var readableContentTypes : [ UTType ] { [. plainText ] } var message : String init ( message : String ) { self . message = message } init ( configuration : ReadConfiguration ) throws { guard let data = configuration . file . regularFileContents , let string = String ( data : data , encoding : . utf8 ) else { throw CocoaError (. fileReadCorruptFile ) } message = string } func fileWrapper ( configuration : WriteConfiguration ) throws - > FileWrapper { return FileWrapper ( regularFileWithContents : message . data ( using : . utf8 )!) } } |