SwiftUI通过导航链接从模态页过渡到常规视图。

问题描述 投票:-1回答:1

我正在用SwiftUI工作,我有一个起始页。当用户在这个页面上按下一个按钮时,会弹出一个模态表。

在模态表中,我有一些类似这样的代码。

  NavigationLink(destination: NextView(), tag: 2, selection: $tag) {
            EmptyView()
    }

我的模态表视图被包裹在一个导航视图里面。

当tag的值变成2的时候,视图确实会进入NextView(),但是它也是以模态表的形式呈现,用户可以从这里向下滑动,我不希望这样。

我想从模态表过渡到常规视图。

这可能吗?我已经尝试过隐藏导航栏等,但似乎没有什么不同。

如果有任何关于此事的帮助,我将感激不尽。

ios swift swiftui modalviewcontroller ios-navigationview
1个回答
1
投票

你可以通过创建一个 environmentObject 并捆绑 navigationLink 的目标值。environmentObject的值,然后改变 environmentObject 的模式视图中。

这里有一段代码解释了我的意思

import SwiftUI

class NavigationManager: ObservableObject{
    @Published private(set) var dest: AnyView? = nil
    @Published var isActive: Bool = false

    func move(to: AnyView) {
        self.dest = to
        self.isActive = true
    }
}

struct StackOverflow6: View {
    @State var showModal: Bool = false
    @EnvironmentObject var navigationManager: NavigationManager
    var body: some View {
        NavigationView {
            ZStack {
                NavigationLink(destination: self.navigationManager.dest, isActive: self.$navigationManager.isActive) {
                    EmptyView()
                }

                Button(action: {
                    self.showModal.toggle()
                }) {
                    Text("Show Modal")
                }
            }
        }
            .sheet(isPresented: self.$showModal) {
                secondView(isPresented: self.$showModal).environmentObject(self.navigationManager)
            }
    }
}

struct StackOverflow6_Previews: PreviewProvider {
    static var previews: some View {
        StackOverflow6().environmentObject(NavigationManager())
    }
}


struct secondView: View {
    @EnvironmentObject var navigationManager: NavigationManager
    @Binding var isPresented: Bool
    @State var dest: AnyView? = nil

    var body: some View {
        VStack {
            Text("Modal view")
            Button(action: {
                self.isPresented = false
                self.dest = AnyView(thirdView())
            }) {
                Text("Press me to navigate")
            }
        }
        .onDisappear {
            // This code can run any where but I placed it in `.onDisappear` so you can see the animation
            if let dest = self.dest {
                self.navigationManager.move(to: dest)
            }
        }
    }
}

struct thirdView: View {
    var body: some View {
        Text("3rd")
            .navigationBarTitle(Text("3rd View"))
    }
}

希望能帮到你,如果你对这个代码有任何疑问,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.