首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用标记/选择或isActive对NavigationView进行编程导航

使用标记/选择或isActive对NavigationView进行编程导航
EN

Stack Overflow用户
提问于 2020-05-21 02:34:38
回答 1查看 472关注 0票数 0

NavigationLink有一个初始化器NavigationLink(destination:, tag:, selection:, label:),它被认为是一个隐藏的NavigationLink,当选择==标签时它就会激活。类似于NavigationLink(destination:isActive:label:)

现在我想知道,我是否可以使用它在模型中拥有一个属性,可以用来在页面之间任意跳转?又名,支持NavigationView的程序化导航?

如下所示:

代码语言:javascript
复制
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的行为像示例一样?

EN

回答 1

Stack Overflow用户

发布于 2020-05-21 03:22:57

目前似乎还不能使用这个API在多个步骤上构建程序化导航(更多信息请参见Asperis comment )。

您只能使用NavigationLink(destination:, tag:, selection:, label:)来制定下一步显示哪个视图的编程决策,例如:

代码语言:javascript
复制
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()
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61920405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档