![](/img/trans.png)
[英]Swiftui - How do I initialize an observedObject using an environmentobject as a parameter?
[英]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.