SwiftUI文档类型DocumentGroup
SwiftUI文档类型DocumentGroup

SwiftUI文档类型DocumentGroup

DocumentGroup 是 SwiftUI 提供的一个专为文档类型应用(Document-based App) 设计的入口结构,用于创建支持打开、保存、编辑文档文件的应用,主要适用于:

macOS(类 Pages、Xcode、Numbers)

iOS/iPadOS(类 Notes、Files、Pages)

基本功能

DocumentGroup 是 SwiftUI 的 @main App 中用于初始化文档应用的方式,它会自动处理:

1、打开文档:支持 macOS 和 iOS 的“打开文件”功能。

2、创建新文档:自动添加“新建文档”菜单。

3、保存文档:自动提供保存机制。

4、多窗口支持(macOS):每个文档一个窗口。

5、快速实现文档架构:无需手动实现 NSDocumentController 或 UIDocumentBrowserViewController。

基本结构

@main
struct MyApp: App {
    var body: some Scene {
        DocumentGroup(newDocument: MyDocument()) { file in
            ContentView(document: file.$document)
        }
    }
}

1、DocumentGroup(newDocument: MyDocument())

DocumentGroup(newDocument: MyDocument())

DocumentGroup(…) 用于创建“文档结构”的App,newDocument:MyDocument() 表示创建新文档时,用这个类型初始化。

2、file in ContentView(document: file.$document)

{ file in
    ContentView(document: file.$document)
}

定义每次打开一个文件时,用哪个View来展示,将文档内容作为 @Binding 传入主视图,支持实时更新。

3、MyDocument结构,必须实现FileDocument协议

import UniformTypeIdentifiers

struct MyDocument: FileDocument {
    static var readableContentTypes: [UTType] { [.plainText] }

    var text: String = ""

    init() {}

    init(configuration: ReadConfiguration) throws {
        if let data = configuration.file.regularFileContents {
            text = String(decoding: data, as: UTF8.self)
        }
    }

    func fileWrapper(configuration: WriteConfiguration) throws -> FileWrapper {
        let data = Data(text.utf8)
        return .init(regularFileWithContents: data)
    }
}

FileDocument是SwiftUI的协议,用于声明一个文档类型的结构,实现它可以让SwiftUI打开文件和保存文件。

1)导入UniformTypeIdentifiers,引入UTType类型,如 .plainText, .image 等。

import UniformTypeIdentifiers

2)实现FileDocument协议:

struct MyDocument: FileDocument

3)支持的文档类型:

static var readableContentTypes: [UTType] { [.plainText] }

表示只打开 .txt(纯文本)类型。

4)文档保存的实际内容:

var text: String = ""

这里文档的内容由文本字符串保存。

5)文档初始化:

init()

新建文档时调用,默认内容为空。

6)打开已有文档时:

init(configuration: ReadConfiguration)

打开已有文档时调用,读取磁盘上的数据。

7)保存文档时调用:

fileWrapper(configuration:)

保存文档时调用,把txt写入一个FileWrapper(文件包)。

文档View示例

struct ContentView: View {
    @Binding var document: MyDocument

    var body: some View {
        TextEditor(text: $document.text)
            .padding()
    }
}

这个界面会自动在修改内容后变“有更改”,并支持保存(Cmd+S)或自动保存。

支持的文档功能

1、打开/保存文件,适用于iOS / macOS。

2、新建文档,适用于macOS / iOS。

3、多窗口支持(每文档一窗口),适用于macOS。

4、自动保存,适用于macOS(AppKit风格)。

5、自定义文件类型,通过 UTType实现,适用于全平台。

6、多文件导入,适用于iOS 16+。

使用场景

1、富文本编辑器。

2、Markdown 编辑器。

3、图像编辑器。

4、结构化 JSON 文件管理

5、数据表格(如 Numbers 类应用)

注意事项

1、DocumentGroup 仅在 SwiftUI 应用中使用(@main App)。

2、不适合复杂文档嵌套结构(如多文件项目,推荐 NSDocument)。

3、文档类型必须 conform to FileDocument。

4、文件类型必须注册(.readableContentTypes)。

总结

DocumentGroup是SwiftUI的文档型App启动结构,通过FileDocument管理文档读取与写入的协议。

支持打开、保存、新建、窗口管理、文档绑定等功能。

相关文章

1、macOS构建文档的NSDocument:https://fangjunyu.com/2025/07/03/macos%e6%9e%84%e5%bb%ba%e6%96%87%e6%a1%a3%e7%9a%84nsdocument/

2、macOS文档控制器NSDocumentController:https://fangjunyu.com/2025/07/03/macos%e6%96%87%e6%a1%a3%e6%8e%a7%e5%88%b6%e5%99%a8nsdocumentcontroller/

3、SwiftUI文档类型协议FileDocument:https://fangjunyu.com/2025/07/05/swiftui%e6%96%87%e6%a1%a3%e7%b1%bb%e5%9e%8b%e5%8d%8f%e8%ae%aefiledocument/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注