【发布时间】:2020-01-16 15:48:02
【问题描述】:
我试图使用 SwiftUI @Environment 属性包装器,但我无法让它按预期工作。请帮助我理解我做错了什么。
例如,我有一个每秒产生一次整数的对象:
class IntGenerator: ObservableObject {
@Published var newValue = 0 {
didSet {
print(newValue)
}
}
private var toCanc: AnyCancellable?
init() {
toCanc = Timer.TimerPublisher(interval: 1, runLoop: .main, mode: .default)
.autoconnect()
.map { _ in Int.random(in: 0..<1000) }
.assign(to: \.newValue, on: self)
}
}
这个对象按预期工作,因为我可以看到控制台日志上生成的所有整数。现在,假设我们希望这个对象是一个环境对象,可以从整个应用程序和任何人访问。让我们创建相关的环境密钥:
struct IntGeneratorKey: EnvironmentKey {
static let defaultValue = IntGenerator()
}
extension EnvironmentValues {
var intGenerator: IntGenerator {
get {
return self[IntGeneratorKey.self]
}
set {
self[IntGeneratorKey.self] = newValue
}
}
}
现在我可以像这样访问这个对象(例如从视图中):
struct TestView: View {
@Environment(\.intGenerator) var intGenerator: IntGenerator
var body: some View {
Text("\(intGenerator.newValue)")
}
}
不幸的是,尽管newValue 是@Published 属性,但我没有收到有关该属性的任何更新,并且Text 始终显示为0。我确定我在这里遗漏了一些东西,这是怎么回事?谢谢。
【问题讨论】:
-
我很困惑,为什么使用环境与环境对象?您可以使用它和发布商
-
@ColinWhooten
EnvironmentObject用于在视图层次结构中注入对象,并使这些对象在视图层次结构内的所有视图中可用。Environment与视图没有严格的关系。它只是在您的项目中创建一个全局依赖项。当您创建Environment依赖项时,您可以从应用程序中的所有实体(不仅仅是视图)访问该依赖项。所以,我想知道我是否可以在Environment对象中观察Published属性。 -
我遇到了同样的问题,但我使用的是
EnvironmentObject,里面有ObservedObject。除非我将ObservedObject更改为Published,否则视图不会更新。谢谢你的提示