如何自定义SwiftUI的File Exporter,将按钮文字从Move改为Save
问题描述
我希望允许用户导出文本文件并保存到其文件系统中,但SwiftUI弹出视图中的按钮显示为“Move”而非“Save”,请问该如何修改此行为?

当前使用的代码:
struct FileExporterDemo: View { @State private var showingExporter = false var body: some View { Button("export"){showingExporter = true} .fileExporter(isPresented: $showingExporter, document: TextFile(initialText: "test"), contentType: .plainText) { result in switch result { case .success(let url): print("Saved to \(url)") case .failure(let error): print(error.localizedDescription) } } } }
解决方案
按钮显示“Move”是因为fileExporter默认逻辑是处理移动现有文件,要切换为“Save”按钮,只需使用带defaultFilename参数的重载方法,触发“保存新文件”模式即可。
修改后的代码:
struct FileExporterDemo: View { @State private var showingExporter = false var body: some View { Button("export"){showingExporter = true} .fileExporter( isPresented: $showingExporter, document: TextFile(initialText: "test"), contentType: .plainText, defaultFilename: "导出的文本文件" // 指定默认文件名,触发保存模式 ) { result in switch result { case .success(let url): print("Saved to \(url)") case .failure(let error): print(error.localizedDescription) } } } }
原理说明
当指定defaultFilename时,系统会识别出这是要创建新文件而非移动已有文件,因此自动将按钮文本切换为“Save”,同时这个参数还能为用户提供默认文件名,优化导出体验。
另外需确保TextFile类正确遵循FileDocument协议,保证文件内容正常写入:
struct TextFile: FileDocument { var text: String init(initialText: String) { text = initialText } static var readableContentTypes: [UTType] { [.plainText] } init(configuration: ReadConfiguration) throws { guard let data = configuration.file.regularFileContents, let string = String(data: data, encoding: .utf8) else { throw CocoaError(.fileReadCorruptFile) } text = string } func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper { let data = text.data(using: .utf8)! return .init(regularFileWithContents: data) } }
内容的提问来源于stack exchange,提问作者Piakkaa
相关产品推荐
相关产品推荐

