如何在辅助 Class 中正确处理 @EnvironmentObject
How to correctly handle @EnvironmentObject within secondary Class
使用@EnvironmentObject 时,可以在另一个class 中使用@EnvironmentObject 吗?
我有一个设置 (MeetingStats) class,然后是一个处理 class(Meeting)。处理 class 和设置 class 都通过我的应用程序中的不同选项卡显示。因此,如果您可以更改设置中的设置,您应该实时看到处理的变化 class(主要是定时器驱动)。
我尝试从使用 AppDelegate 切换到在视图之间传递内容,再切换到使用 @EnvironmentObject。我更改了我的 ScceneDelegate 以创建初始 objects,并将它们传递给 ContentView。但是,当我 运行 应用程序时,我第一次尝试在处理 class 中访问设置 class 时,我崩溃并显示消息 No ObservableObject of type MeetingStats found。作为此视图的祖先,MeetingStats 的 View.environmentObject(_:) 可能缺失。
场景代理
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()
}
}
}
内容视图是一组选项卡,一个用于会议,一个用于设置,一个用于统计
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 传递到选项卡吗?我已经尝试将环境 object 显式传递给 meetingView 但仍然收到相同的错误:
iOSMeetingView()
.environmentObject(meeting)
.environmentObject(meetingStats)
.tabItem {
Image("presentation")
Text("Meeting")
}.tag(1)
我认为这不是必需的,因为 Swift 是在 object 层次结构中查找 object。
您是否在 iOSMeetingView 视图中添加了环境对象?
@EnvironmentObject var meetingStats: MeetingStats
已编辑:我不确定您的要求。这是我的想法。仅传递EnvironmentObject meetingStats 即可查看,在Meeting 中更新时会得到meetingStats 的值变化。
class Meeting {
func calcQuorumEvents(meetingStats: MeetingStats) {
meetingStats.totalWasteAmount = 12 // HERE's the Crash
meetingStats.totalWasteAmountPersonal = 60
meetingStats.totalLifetimeWasteAmount = 8
}
}
class MeetingStats: ObservableObject {
@Published var totalWasteAmount: Int
@Published var totalWasteAmountPersonal: Int
@Published var totalLifetimeWasteAmount: Int
init() {
totalWasteAmount = 0
totalWasteAmountPersonal = 0
totalLifetimeWasteAmount = 0
}
}
使用@EnvironmentObject 时,可以在另一个class 中使用@EnvironmentObject 吗?
我有一个设置 (MeetingStats) class,然后是一个处理 class(Meeting)。处理 class 和设置 class 都通过我的应用程序中的不同选项卡显示。因此,如果您可以更改设置中的设置,您应该实时看到处理的变化 class(主要是定时器驱动)。
我尝试从使用 AppDelegate 切换到在视图之间传递内容,再切换到使用 @EnvironmentObject。我更改了我的 ScceneDelegate 以创建初始 objects,并将它们传递给 ContentView。但是,当我 运行 应用程序时,我第一次尝试在处理 class 中访问设置 class 时,我崩溃并显示消息 No ObservableObject of type MeetingStats found。作为此视图的祖先,MeetingStats 的 View.environmentObject(_:) 可能缺失。
场景代理
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()
}
}
}
内容视图是一组选项卡,一个用于会议,一个用于设置,一个用于统计
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 传递到选项卡吗?我已经尝试将环境 object 显式传递给 meetingView 但仍然收到相同的错误:
iOSMeetingView()
.environmentObject(meeting)
.environmentObject(meetingStats)
.tabItem {
Image("presentation")
Text("Meeting")
}.tag(1)
我认为这不是必需的,因为 Swift 是在 object 层次结构中查找 object。
您是否在 iOSMeetingView 视图中添加了环境对象?
@EnvironmentObject var meetingStats: MeetingStats
已编辑:我不确定您的要求。这是我的想法。仅传递EnvironmentObject meetingStats 即可查看,在Meeting 中更新时会得到meetingStats 的值变化。
class Meeting {
func calcQuorumEvents(meetingStats: MeetingStats) {
meetingStats.totalWasteAmount = 12 // HERE's the Crash
meetingStats.totalWasteAmountPersonal = 60
meetingStats.totalLifetimeWasteAmount = 8
}
}
class MeetingStats: ObservableObject {
@Published var totalWasteAmount: Int
@Published var totalWasteAmountPersonal: Int
@Published var totalLifetimeWasteAmount: Int
init() {
totalWasteAmount = 0
totalWasteAmountPersonal = 0
totalLifetimeWasteAmount = 0
}
}