[英]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.