如何在循环中更新状态时显示所有中间视图,swiftUI

如何在循环中更新状态时显示所有中间视图,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 {

如何强制视图更新以反映所有@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 {
        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秒?)更新,它应该可以工作。当然,如果你的应用程序是一个在更新计数器后有实际逻辑的游戏,那么你的代码确实与你应该做的不太接近。谢谢。我只是想知道,如果没有计时器,这种想法是否也能起作用。谢谢你的时间和代码。它起作用了。我只是希望有一个更简单的方法来实现同样的事情没有计时器。