在 SwiftUI 中将 FileDocumentReadConfiguration 传递给文档结构的初始化程序
Posted
技术标签:
【中文标题】在 SwiftUI 中将 FileDocumentReadConfiguration 传递给文档结构的初始化程序【英文标题】:Passing a FileDocumentReadConfiguration to a document struct's initializer in SwiftUI 【发布时间】:2020-12-02 19:35:56 【问题描述】:当您创建基于文档的 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
参数?
【问题讨论】:
【参考方案1】:SwiftUI 结构 FileDocumentReadConfiguration、ReferenceFileDocumentConfiguration 等的实现细节没有记录,因为它们不是公开的。为了独立于平台,SwiftUI 处理了许多可能令人困惑的默认行为,因为这样做还隐藏了很多信息。为了避免ReadConfiguration
难题,我们需要像 Xcode 模板一样,在此处或在变量声明中提供具有默认值的自定义初始化程序。那就是你在DocumentGroup
init 中调用的初始化,让 SwiftUI 处理细节。
【讨论】:
向文档结构添加自定义初始化程序可消除编译器错误。谢谢。【参考方案2】:var body: some Scene DocumentGroup(newDocument: Document()) file in ContentView(document: file.$document)
这是创建新文档的地方,即还没有文件表示。
如果您将Document
声明为FileDocument
,则需要提供带有ReadConfiguration
的初始化程序,在这种情况下,它是FileDocumentReadConfiguration
的类型别名,当您的应用程序被要求打开时,系统将调用此初始化程序existed 对应文档类型的文档:
struct Document: FileDocument
// here configuration is-a `FileDocumentReadConfiguration`
init(configuration: ReadConfiguration) throws
// read here your content from configuration using `configuration.file`
// ... other code
【讨论】:
SwiftUI 文档应用程序的 Xcode 项目为文档提供了这个初始化,所以我有初始化程序。问题是编译器希望我在调用初始化程序时提供一个 ReadConfiguration 实例。required
关键字仅适用于类。当我将 required
添加到我的结构的 init 时,我收到以下编译器错误:非类类型中的必需初始化程序。以上是关于在 SwiftUI 中将 FileDocumentReadConfiguration 传递给文档结构的初始化程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SwiftUI 中将 TabView 与 NavigationView 一起使用?
如何在 SwiftUI 中将 LocalizedStringKey 更改为 String