SwiftUI:在复杂视图中确定流

SwiftUI:在复杂视图中确定流,swift,swiftui,Swift,Swiftui,我正在用SwiftUI构建一个锻炼应用程序,想知道控制以下情况的最佳方法 “训练”视图包含练习的视频,在用户必须做的所有练习的多行之后 [短片] [练习1] [练习2] [练习3] 每个[练习1]都是一个自己的视图,包含一个进度条,让用户知道哪个练习当前处于活动状态,还有多少时间 当用户进入屏幕时,第一个练习[练习1]应处于活动状态,进度条应开始设置动画。当时间到了,下一个练习应该激活,直到所有练习都完成 在UIKit中,这将非常容易。我只需要为第一个exercise调用一个“start()”方

我正在用SwiftUI构建一个锻炼应用程序,想知道控制以下情况的最佳方法

“训练”视图包含练习的视频,在用户必须做的所有练习的多行之后

[短片] [练习1] [练习2] [练习3]

每个[练习1]都是一个自己的视图,包含一个进度条,让用户知道哪个练习当前处于活动状态,还有多少时间

当用户进入屏幕时,第一个练习[练习1]应处于活动状态,进度条应开始设置动画。当时间到了,下一个练习应该激活,直到所有练习都完成

在UIKit中,这将非常容易。我只需要为第一个exercise调用一个“start()”方法,然后有一个回调“exercisesdidfinish”,然后就可以开始下一个练习了

我用SwiftUI尝试了类似的设置,但似乎应该有一种更快捷的方法来实现这一点


如何使用SwiftUI实现这一点?

如果我实现了它,我会创建一个视图作为四个视图的基础视图,以便进行所需的转换。基本视图将有一个计时器来执行以下基于时间的任务

let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
可以根据进度分辨率正确设置间隔。
然后,我将使用
onReceive
修饰符订阅计时器,并在其中放置一些转换逻辑

我还将使用
transition
modifier将任何动画效果应用于过渡

我将简要地向您展示一个伪代码以供参考

struct BaseView: View {

  @State private var step: STEP = .first
  let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()

  var body: some View {
    ZStack {
        if step == .first {
          FirstStepView()
            .transition(.opacity)
        } else if step == .second {
          SecondStepView()
            .transition(.opacity)
        }
    }
    .overlay(progressBar)
    .onReceive(timer) { tick in
        ....
        `step` can be changed in proper condition
    }
  }

  var progressBar: some View {
     ... implement the progress bar ...
  }
}