![](/img/trans.png)
[英]How to pass an EnvironmentObject to an ObservedObject within that EnvironmentObject?
[英]How to correctly handle @EnvironmentObject within secondary Class
使用@EnvironmentObject 時,您可以在另一個class 中使用@EnvironmentObject 嗎?
我有一個設置(MeetingStats)class,然后是一個處理類(會議)。 處理 class 和設置類都通過我的應用程序中的不同選項卡顯示。 因此,如果您可以在 setup 中更改設置,您應該實時看到對處理 class(主要是定時器驅動)的更改。
我試圖從使用 AppDelegate 切換到在視圖之間傳遞東西,再到使用 @EnvironmentObject。 我已更改我的 ScceneDelegate 以創建初始對象,並將它們傳遞給 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 傳遞給選項卡嗎? 我嘗試將 Environment object 顯式傳遞給 meetingView 但仍然收到相同的錯誤:
iOSMeetingView()
.environmentObject(meeting)
.environmentObject(meetingStats)
.tabItem {
Image("presentation")
Text("Meeting")
}.tag(1)
我不認為這是必需的,因為 Swift 是在 object 層次結構中查找 object。
您是否在 iOSMeetingView 視圖中添加了環境對象?
@EnvironmentObject var meetingStats: MeetingStats
編輯:我不確定你的要求。 這是我的想法。 僅通過 EnvironmentObject meetingStats 進行查看,您將在 MeetingStats 更新時獲取 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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.