You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义SwiftUI的File Exporter,将按钮文字从Move改为Save

问题描述

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

导出弹窗显示Move按钮

当前使用的代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:30:49