如何在类中访问全局环境对象?

10

我有一个需要更新全局环境对象的类。我可以在我的结构体之间传递该环境对象,但如何允许类对象访问相同的变量?

import SwiftUI

class Global: ObservableObject
{
    @Published var num = 10
}

class MyClass:ObservableObject
{
    @Published var mode = 1
    @EnvironmentObject var global: Global

    func updateMode()
    {
        self.mode += 1
        global.num += 1
    }
}

@main
struct MyApp: App
{
    let settings = Global()
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(settings)
            }
    }
}

struct ContentView: View
{
    @EnvironmentObject var global: Global
    @ObservedObject var myClass = MyClass()
    
    var body: some View
    {
        VStack
        {
            Text("Setting \(global.num)")
            Text("Mode \(myClass.mode)")

            Button("Click Me", action: {myClass.updateMode()})
        }
        .padding()
    }
}

以下代码报错:

致命错误:找不到类型为Global的ObservableObject。视图缺少View.environmentObject(_:) for Global的祖先。

我可以将全局对象传递给 MyClass.updateMode,但此时它似乎并不是真正的全局变量?我认为一定有更好的方法。
1个回答

19

一种可能的方法是使其共享,并且不要在 SwiftUI 视图之外的任何地方使用 @EnvironmentObject - 它并非为此设计:

class Global: ObservableObject
{
    static let shared = Global()

    @Published var num = 10
}

class MyClass:ObservableObject
{
    @Published var mode = 1
    let global = Global.shared    // << here !!

// ...
}

@main
struct MyApp: App
{
    @StateObject var settings = Global.shared  // << same !!
// ...
}

请注意,您需要像这样绑定到@Published值:$settings.num - Evan Moran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接