如何访问类中的全局环境对象? [英] How to access a global environment object in a class?

查看:40
本文介绍了如何访问类中的全局环境对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a class that needs to update a global environment object. I can pass that environment object between my structs all day, but how do I allow a class object to access the same variable?

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 可能缺少这个观点.

Fatal Error: No ObservableObject of type Global found. A View.environmentObject(_:) for Global maybe missing an ancestor of this view.

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

I could pass the global object into myClass.updateMode, but then it doesn't seem very global at that point? I would have thought there must be a better way.

推荐答案

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

A possible approach is to make it shared (and don't use @EnvironmentObject anywhere outside SwiftUI view - it is not designed for that):

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 !!
// ...
}

这篇关于如何访问类中的全局环境对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆