簡體   English   中英

如何在輔助 Class 中正確處理 @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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM