NavigationLink有一个初始化器NavigationLink(destination:, tag:, selection:, label:),它被认为是一个隐藏的NavigationLink,当选择==标签时它就会激活。类似于NavigationLink(destination:isActive:label:)。
现在我想知道,我是否可以使用它在模型中拥有一个属性,可以用来在页面之间任意跳转?又名,支持NavigationView的程序化导航?
如下所示:
import SwiftUI
enum NavStep {
case step1
case step2
}
class NavModel: ObservableObject {
@Published var step: NavStep? = .step1
}
struct Page1View: View {
@EnvironmentObject var navModel: NavModel
var body: some View {
VStack(spacing: 20) {
// Hidden link from Page1 -> Page2 that gets active when model.step is set to .step2
NavigationLink(destination: Page2View(), tag: NavStep.step2, selection: $navModel.step) {
EmptyView()
}
Text("Page 1")
Button("Go to Page 2") {
self.navModel.step = .step2
}
}
.navigationBarTitle("Page 1")
}
}
struct Page2View: View {
@EnvironmentObject var navModel: NavModel
var body: some View {
VStack(spacing: 20) {
Text("Page 2")
Button("Go to Page 1") {
self.navModel.step = .step1
}
}
.navigationBarTitle("Page 2")
}
}
struct ProgrammaticNavigationExample: View {
var body: some View {
NavigationView {
Page1View()
}
.environmentObject(NavModel())
}
}
struct ProgrammaticNavigationExample_Previews: PreviewProvider {
static var previews: some View {
ProgrammaticNavigationExample()
}
}很好,适用于两个页面,您可以通过设置step属性以编程方式导航。但是,现在我想知道,这怎么能扩展到另一个页面,第三页?
当我尝试天真地这样做时,设置'model.step = .step3‘会断开第一个页面中的导航链接,我们返回到第一页。即使我使用可以相应设置的两个布尔属性'enteredStep2’/ 'enteredStep3‘对此进行建模,当尝试通过设置这些属性返回时,它也会变得不稳定。
您知道如何使用此API (或其他方式)启用程序化导航吗?或者有什么线索可以解释为什么NavigationView/NavigationLink的行为像示例一样?
发布于 2020-05-21 03:22:57
目前似乎还不能使用这个API在多个步骤上构建程序化导航(更多信息请参见Asperis comment )。
您只能使用NavigationLink(destination:, tag:, selection:, label:)来制定下一步显示哪个视图的编程决策,例如:
struct ProgrammaticNavigationExampleView: View {
enum NavDestination {
case red
case green
}
@State var destination : NavDestination?
var body: some View {
VStack(spacing: 20) {
NavigationLink(destination: Color.red, tag: NavDestination.red, selection: $destination) {
EmptyView()
}
NavigationLink(destination: Color.green, tag: NavDestination.green, selection: $destination) {
EmptyView()
}
Text("Page 1")
Button("Show random page") {
self.destination = [.red, .green].randomElement()!
}
}
.navigationBarTitle("Page 1")
}
}
struct ProgrammaticNavigationExample_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
ProgrammaticNavigationExampleView()
}
}
}https://stackoverflow.com/questions/61920405
复制相似问题