【发布时间】:2019-12-23 08:24:45
【问题描述】:
我在 EnvironmentObject 中为我的应用程序创建了一个“状态”对象 像这样:
class AppState: ObservableObject {
@Published var counter = Counter()
}
要将其添加到我使用的应用程序中:
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(state))
计数器是后台任务
class Counter: ObservableObject {
@Published var amount: Double
var timer = Timer()
init() {
self.amount = 0.0
self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(setCoords), userInfo: nil, repeats: true)
}
@objc private func setCoords() {
DispatchQueue.main.async() { () -> Void in
self.amount = self.amount + 0.1
print(self.amount)
}
}
}
在我看来,我有:
struct ContentView: View {
@EnvironmentObject var state: AppState
@State var isVisible = true
var body: some View {
VStack {
Button(action: {
self.isVisible.toggle()
}) {
Text("Button")
}
if isVisible {
Text(state.counter.amount.description)
}
}
}
}
所以基本上,我希望我的 UI 每秒更新一次后能看到计数器。但是 UI 没有更新。我看到打印语句每秒触发一次,如果我从 UI 按钮 self.isVisible.toggle() 触发 UI 更新,那么计数器也会更新。
如果不将计数器移动到视图中或在状态对象中实现它,我该如何解决这个问题?
【问题讨论】: