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 {
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。
谢谢!
解决方案
您可以添加一个 Timer 发布者来在 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() }
}
}
推荐阅读
- regex - Python,仅针对指定单词从字符串中删除所有非字母字符
- javascript - 从数组中扩展现有对象的数据
- java - 子节点的标签可以与根节点相同吗?
- javascript - How to store independent variables into an array as an object
- c# - Read SqlDataReader after Exception -- LIKE SSMS Result Pane
- mysql - count by name the number of all values, within a given DB SQL column
- mysql - 主机数据库服务器更改后,Wordpress 主题页面消失了
- javascript - 导出 vuejs 组件以重用
- sql - 如何按国家/地区查询 PostGIS 中的数据?
- python - 如何随机旋转二维数组中的正方形?