我有以下计时器:
struct ContentView: View {
@State var timeRemaining = 10
let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
var body: some View {
NavigationView{
VStack {
if(self.timeRemaining > 0) {
Text("\(timeRemaining)")
.onReceive(timer) { _ in
if self.timeRemaining > 0 {
self.timeRemaining -= 1
}
}
} else {
Text("Time is up!")
}
}
}
}
}
如果我删除了NavigationView
视图,计时器会更新并工作,但它不会,这是怎么回事?在NavigationView
中如何更新它?或者有更好的实践吗?
谢谢
2条答案
按热度按时间yhived7q1#
最好将观察者附加到无条件视图,如
**更新:**添加了一些想法(当然,SwiftUI的内部结构只有苹果才知道)。
.onReceive必须附加到NavigationView中的永久显示视图,原因很可能是在条件ViewBuilder中以及UIKit UINavigationController周围的NavigationView Package 器内部。
如果您删除了条件,并在NavigationView内的VStack中有一个带有onReceive的文本视图,则不会收到任何内容
如果条件删除后,它被附加到
Text("\(timeRemaining)")
,则所有工作(使用Xcode 11.4测试),因为主体中存在状态依赖性。如果将其附加到常量Text,则主体中没有任何变化,即取决于已更改的状态-
timeRemaining
,因此SwiftUI渲染引擎将主体解释为静态。o2gm4chl2#
有同样的问题,但不是一对一。我解决了这样:我的内容视图有.onApper {binancemanager.fetch()} --〉我在这里调用,但是我把它移到了@main结构我的应用程序:{WindowsGroup. Vstack. Content.