如何正确处理二级类中的@EnvironmentObject

问题描述

使用@EnvironmentObject时,可以在另一个类中使用@EnvironmentObject吗?

我有一个设置(MeetingStats)类,然后是一个处理类(Meeting)。处理类和设置类都通过我应用中的不同选项卡显示。因此,如果可以在安装程序中更改设置,则应该实时看到对处理类的更改(主要由计时器驱动)。

我试图从使用AppDelegate切换到在视图之间传递东西,而改用@EnvironmentObject。我已经更改了ScceneDelegate来创建初始对象,并将它们.envrionmentObjects传递给ContentView。但是,当我运行该应用程序时,第一次尝试访问处理类中的安装程序类时,我崩溃,并发现消息:MeetingStats类型的No ObservableObject。作为该视图的祖先,可能缺少用于MeetingStats的View.environmentObject(_:)。

SceneDelegate

class SceneDelegate: UIResponder,UIWindowSceneDelegate {
    var meetingStats = MeetingStats()
    var meeting = Meeting()
    func scene(_ scene: UIScene,willConnectTo session: UISceneSession,options connectionOptions: UIScene.ConnectionOptions)
    {
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            // passing EnvironmentObjects 
            window.rootViewController = UIHostingController(rootView:
                                                                ContentView()
                                                                .environmentObject(meeting)
                                                                .environmentObject(meetingStats)
                                                             )
            self.window = window
            window.makeKeyAndVisible()
        }
    }
}

Content View是一组选项卡,一个用于会议,一个用于设置,一个用于统计

meeting.swift-简化以显示问题区域

//
//  meeting.swift
import Foundation
import SwiftUI
import Combine
import Intents
import os
class Meeting: ObservableObject {
    @EnvironmentObject var meetingStats: MeetingStats
    @objc func calcQuorumEvents() {
   // LOTS of calcualtions     
        self.meetingStats.totalWasteAmount = totalWasteAmount. // HERE's the Crash
        self.meetingStats.totalWasteAmountPersonal = totalWasteAmountPersonal
        self.meetingStats.totalLifetimeWasteAmount = totalLifetimeWasteAmount
    }
  }

问题不是我没有将值从contentView显式传递给选项卡吗?我尝试将环境对象显式传递给MeetingView,但仍然收到相同的错误:

iOSMeetingView()
                .environmentObject(meeting)
                .environmentObject(meetingStats)
                .tabItem {
                    Image("presentation")
                    Text("Meeting")
            }.tag(1)

我不认为这是必需的,因为Swift会在对象层次结构中查找对象。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)