首页 > 解决方案 > 在 SwiftUI 中将 FileDocumentReadConfiguration 传递给文档结构的初始化程序

问题描述

创建基于文档的 SwiftUI 项目时,文档结构包含以下初始化程序:

init(configuration: ReadConfiguration) throws {
    // Code to open an existing document
}

在 Xcode 提供的初始文本编辑器项目中,当在 App 文件中调用文档的初始化程序时,您不必提供配置参数。

var body: some Scene {
    DocumentGroup(newDocument: Document()) { file in
        ContentView(document: file.$document)
    }
}

在我的项目中,文档包含另一个结构的数组,并将文档保存在文件包中。现在编译器抱怨我configuration在调用文档的初始化程序时缺少参数。

如果我提供一个FileDocumentReadConfiguration对象作为configuration参数,

DocumentGroup(newDocument: Document(configuration: FileDocumentReadConfiguration())) { file in
    ContentView(document: file.$document)
}

编译器提供以下错误消息:

FileDocumentReadConfiguration 无法构造,因为它没有可访问的初始化程序

Apple 文档中的信息FileDocumentReadConfiguration与初始化程序无关。在 Google 上搜索FileDocumentReadConfiguration只会得到 Apple 的文档和 Hacking with Swift 论坛上的一个未回答的问题。没有人在 Stack Overflow 上问过这个问题。

如何FileDocumentReadConfiguration向文档的初始化程序提供对象,或者如何避免configuration像默认项目那样提供参数?

标签: swiftui

解决方案


SwiftUI 结构 FileDocumentReadConfiguration、ReferenceFileDocumentConfiguration 等的实现细节没有记录,因为它们不是公开的。为了独立于平台,SwiftUI 处理了许多可能令人困惑的默认行为,因为这样做还隐藏了很多信息。为了避免这个ReadConfiguration难题,我们需要像 Xcode 模板一样提供一个自定义初始化器,或者在其中或在变量声明中使用默认值。那就是你在 init 中调用的DocumentGroup初始化,让 SwiftUI 处理细节。


推荐阅读