【问题标题】:How to access a global environment object in a class?如何访问类中的全局环境对象?
【发布时间】:2020-12-19 14:12:53
【问题描述】:

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

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()
    }
}

以下代码报错:

致命错误:未找到全局类型的 ObservableObject。一种 View.environmentObject(_:) for Global 可能缺少一个祖先 这个观点。

我可以将全局对象传递给 myClass.updateMode,但那时它似乎不是很全局?我原以为一定有更好的方法。

【问题讨论】:

    标签: swiftui environmentobject


    【解决方案1】:

    一种可能的方法是将其共享(并且不要在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 !!
    // ...
    }
    

    【讨论】:

    • 谢谢。这已经成为我最喜欢的 goto 解决方案之一。
    • 请注意,您需要像这样绑定到 @Published 值:$settings.num
    猜你喜欢
    • 2015-08-30
    • 2016-05-09
    • 1970-01-01
    • 2018-12-23
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多