繁体   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