在 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 中将部分文本加粗

如何在swiftUI中将背景颜色添加到列表中

如何在 SwiftUI 中将 TabView 与 NavigationView 一起使用?

如何在 SwiftUI 中将 LocalizedStringKey 更改为 String

在 ScrollView 中将文本对齐为前导 - SWIFTUI

如何在 SwiftUI 中将模糊效果作为背景?