簡體   English   中英

如何將 EnvironmentObject 傳遞給該 EnvironmentObject 中的 ObservedObject?

[英]How to pass an EnvironmentObject to an ObservedObject within that EnvironmentObject?

我有一個名為GameManager()EnvironmentObject ,它基本上是我的應用程序的根:

class GameManager: ObservableObject {
    @ObservedObject var timeManager = TimeManager()

因為里面有很多代碼,所以我想將某些任務委托給單獨的類/文件。

例如,我想創建一個每秒運行的計時器。 這可以很容易地在GameManager()中運行,但我想將它委托給一個名為TimeManager()的單獨 class :

class TimeManager: ObservableObject {
    @EnvironmentObject var gameManager: GameManager
    var activeGameTimer: Timer?
    @Published var activeGameSeconds: Int = 0
    
    func start(){
        self.activeGameTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true){ _ in
            self.activeGameSeconds += 1  
        }
    }
}

唯一的問題是, TimeManager需要引用GameManager() - 以便對我的游戲中的某些事件做出反應。

但是,似乎沒有辦法將GameManager()傳遞給TimeManager()

有沒有一種順利的方法來實現這一目標? 如果沒有,是否有另一種方式我應該安排我正在嘗試做的事情?

如果解決方案是hacky,我寧願不這樣做。

首先, @EnvironmentObject @ObservedObject為 SwiftUI 視圖設計的屬性包裝器,不適用於其他視圖,因此在類中使用它們可能是有害的,或者至少是無用的——它們不會像你預期的那樣運行。

現在,您的方案的解決方案是依賴注入(兩種類型都是引用類型,因此實例作為引用注入):

class GameManager: ObservableObject {
    var timeManager: TimeManager!

    init() {
       timeManager = TimeManager(gameManager: self)
    }
    // ... other code
}

class TimeManager: ObservableObject {
    var gameManager: GameManager

    var activeGameTimer: Timer?
    @Published var activeGameSeconds: Int = 0

    init(gameManager: GameManager) {
       self.gameManager = gameManager
    }

    // ... other code
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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