如何在循环中更新状态时显示所有中间视图,swiftUI
如何强制视图更新以反映所有@State更改,但不从初始状态跳到最终状态如何在循环中更新状态时显示所有中间视图,swiftUI,swiftui,Swiftui,如何强制视图更新以反映所有@State更改,但不从初始状态跳到最终状态 import SwiftUI struct ContentView: View { @State var counter = 0 func updatecounter(){ for _ in 1...10{withAnimation(.easeInOut(duration: 1)){counter+=1}} } var body: some View {
import SwiftUI
struct ContentView: View {
@State var counter = 0
func updatecounter(){
for _ in 1...10{withAnimation(.easeInOut(duration: 1)){counter+=1}}
}
var body: some View {
VStack {
Spacer()
Text("Counter: \(self.counter)")
Spacer()
Button(action: {self.updatecounter()}){Text("Update Counter")}
Spacer()
}
}
}
struct ContentView_Previews: PreviewProvider {static var previews: some View {ContentView()}}
我希望上面的代码在单击按钮时显示从1到10的所有数字(1,2,3,4,5…),而不是像当前那样立即从1跳到10
谢谢 您可以添加计时器发布器以在SwiftUI中制作连续动画:
import Combine
@State var counter = 0
@State var cancelable : AnyCancellable?
func updatecounter(){
cancelable = Timer.publish(every: 1, on: RunLoop.main, in: RunLoop.Mode.default).autoconnect().sink { (Date) in
withAnimation(Animation.easeInOut(duration: 1)){
self.counter += 1
}
if self.counter == 10 {
self.cancelable?.cancel() }
}
}
我认为SwiftUI的本质是简单地对状态变化做出反应——由于您几乎是在1-10之间立即更新计数器,因此您需要降低模型的速度。你真的没有说为什么/你在这里尝试什么,所以我最初的想法是(a)将你的代码移动到一个真实的模型中,并在它上附加一个计时器。将它设置为以某个间隔(0.3秒?)更新,它应该可以工作。当然,如果你的应用程序是一个在更新计数器后有实际逻辑的游戏,那么你的代码确实与你应该做的不太接近。谢谢。我只是想知道,如果没有计时器,这种想法是否也能起作用。谢谢你的时间和代码。它起作用了。我只是希望有一个更简单的方法来实现同样的事情没有计时器。