swift 如何创建可在主App结构体中使用的全局文档对象?

0sgqnhkj  于 2023-02-15  发布在  Swift
关注(0)|答案(1)|浏览(108)

我正在开发一个简单的SwiftUI macOS文档应用程序。在主应用程序结构中,我想添加修改文档对象的菜单项。在基于文档的应用程序的Xcode应用程序模板中,如果我添加一个菜单项,主应用程序结构看起来类似于:

import SwiftUI

@main
struct GlobalDocApp: App {
    var body: some Scene {
        DocumentGroup(newDocument: GlobalDocDocument()) { file in
            ContentView(document: file.$document)
        }
        .commands {
            CommandMenu("Custom Menu") {
                Button("Modify it") {
                    //modify document properties...
                }
            }
        }
    }
}

如何创建文档对象,以便可以从该结构体以及其他视图结构体访问它?文档对象可以在整个应用中用作@EnvironmentObject吗?
我尝试在App结构体中将文档对象声明为@StateObject,但它需要是可观察的,我的GlobalDocDocument是一个结构体,声明如下:

struct GlobalDocDocument: FileDocument
qvk1mo1f

qvk1mo1f1#

@StateObject只能用于类。将@StateObject用于文档类型的唯一方法是将文档类型设置为类。但是关于将类用于SwiftUI文档的文档不多。
在需要访问文档的任何SwiftUI视图中添加@Binding变量,其中文档类型为struct。

@Binding var document: GlobalDocDocument

您不必在app结构体中创建绑定。
使用焦点值和焦点绑定访问SwiftUI菜单中的文档。以下文章说明如何访问SwiftUI菜单中的文档:
Accessing the Document in a SwiftUI Menu

相关问题