如何在SwiftUI中从工作表视图转到另一个页面?

时间:2020-10-25 13:12:11

标签: ios swift swiftui swiftui-navigationlink

我正在尝试从工作表视图转到另一页。这是第一个视图的代码:

      UnitId  StartTime    IsFree    IsWalkin
--  --------  -----------  --------  ----------
60      5097  2020-11-01   True      False
78      5097  2020-11-19   True      False
87      5097  2020-11-28   True      False

这是第二个视图的代码:

struct FirstView: View {
    @State fileprivate var isShowingSheet: Bool = false

    var body: some View {
        Button(action: {
            isShowingSheet = true
        }) {
            Text("Show the sheet")
        }
        .sheet(isPresented: $isShowingSheet, content: {
            SecondView()
        })
    }
}

问题在于,第三个视图也将在该工作表中。是否可以将第三个视图设置为普通页面而不是工作表中的视图?

谢谢!

1 个答案:

答案 0 :(得分:0)

NavigationLink应该在NavigationView的同一视图层次结构中工作,但是.sheet引入了另一个不同的视图层次结构,因此解决方案是将导航链接保留(隐藏)在先前的视图中,但可以通过工作表中的视图以编程方式将其激活。

这是一个演示(已通过Xcode 12 / iOS 14测试)

struct FirstView: View {
    @State fileprivate var isShowingSheet: Bool = false
    @State private var showThirdView = false

    var body: some View {
        Button(action: {
            isShowingSheet = true
        }) {
            Text("Show the sheet")
        }
        .sheet(isPresented: $isShowingSheet, content: {
            SecondView(showNext: $showThirdView)
        })
        .background(
              NavigationLink(destination: ThirdView(), isActive: $showThirdView) {
                    EmptyView()
              }
        )
    }
}

struct SecondView: View {
    @Environment(\.presentationMode) var presentationMode
    @Binding var showNext: Bool

    var body: some View {
        Button("Show the third view.") {
            self.presentationMode.wrappedValue.dismiss()
            DispatchQueue.main.async {
                self.showNext = true
            }
        }
    }
}