0

我正在尝试在 SwiftUI 中创建一个多视图工作流程,您可以在其中从上次中断的地方重新开始,但仍然有很好的 NavigationView 过渡。

作为一个基本示例,我希望它具有SignupView(您输入用户凭据的位置)> PersonalInfoView(您输入其他个人信息的位置)>etc.

我最初使用一个简单的 NavigationLink 从一步到下一步。但我也想要它,如果你完成SignupView然后退出应用程序,如果你再次打开它,用户可以PersonalInfoView直接被带到。例如,您可以从上次中断的地方重新开始。

所以我想到了使用条件渲染:

if !userExists { 
  SignupView() 
} else if !hasPersonalInfo {
  PersonalInfoView()
} else {
  Text("Signup complete")
}

但是现在,每当我从SignupView到时,PersonalInfoView我都不会像使用 NavigationLink 那样获得漂亮的滑动过渡。如果我添加 NavigationLink 到 go to PersonalInfoView,它会滑入其中(就像典型的导航一样),然后滑出到另一个版本的视图(条件渲染)。

所以我想我的问题是,在整个 NavigationView 范式中始终处理条件视图的最佳方式是什么。谢谢

编辑:我可能没有很好地解释我的问题:我仍然想对所有内容使用 NavigationView(以便获得转换、后退按钮等)。我只是希望能够从流程中的不同点开始,但之后的每个视图都将成为导航堆栈的一部分。

4

1 回答 1

3

您可以将转换显式应用于视图:

if !userExists { 
  SignupView()
    .transition(.slide)
} else if !hasPersonalInfo {
  PersonalInfoView()
    .transition(.opacity)
} else {
  Text("Signup complete")
    .transition(.slide)
}

此外,对于某些转换,您可能需要设置块userExists内部withAnimation

withAnimation {
    userExists = true
}

编辑

这是一个更新版本(假设userExistshasPersonalInfo被持久化(例如,存储在 UserDefaults 中):

struct ContentView: View {
    var userExists = true
    var hasPersonalInfo = false

    var body: some View {
        NavigationView {
            VStack {
                if !userExists {
                    SignupView()
                } else if !hasPersonalInfo {
                    PersonalInfoView()
                } else {
                    Text("Signup complete")
                }
            }
        }
    }
}
struct SignupView: View {
    @State private var isLinkActive = false

    var body: some View {
        VStack {
            Text("SignupView")
            Button("Go to PersonalInfoView") {
                self.isLinkActive = true
            }
            .background(NavigationLink(destination: PersonalInfoView(), isActive: $isLinkActive) { EmptyView() }.hidden())
        }
    }
}
struct PersonalInfoView: View {
    @State private var isLinkActive = false

    var body: some View {
        VStack {
            Text("PersonalInfoView")
            Button("Go to MainView") {
                self.isLinkActive = true
            }
            .background(NavigationLink(destination: Text("Signup complete"), isActive: $isLinkActive) { EmptyView() }.hidden())
        }
    }
}
于 2020-09-10T21:54:41.630 回答