Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用导航链接从模式工作表到常规视图的快速转换_Ios_Swift_Swiftui_Modalviewcontroller_Ios Navigationview - Fatal编程技术网

Ios 使用导航链接从模式工作表到常规视图的快速转换

Ios 使用导航链接从模式工作表到常规视图的快速转换,ios,swift,swiftui,modalviewcontroller,ios-navigationview,Ios,Swift,Swiftui,Modalviewcontroller,Ios Navigationview,我正在与SwiftUI合作,我有一个起始页。当用户按下此页面上的按钮时,将弹出一个模式表 在模态表的侧面,我有如下代码: NavigationLink(destination: NextView(), tag: 2, selection: $tag) { EmptyView() } 我的模式工作表视图被包装在导航视图中 当tag的值变为2时,视图确实转到NextView(),但它也显示为一个模式表,用户可以从中向下滑动,我不希望出现这种情况 我想从模式工作表

我正在与SwiftUI合作,我有一个起始页。当用户按下此页面上的按钮时,将弹出一个模式表

在模态表的侧面,我有如下代码:

  NavigationLink(destination: NextView(), tag: 2, selection: $tag) {
            EmptyView()
    }
我的模式工作表视图被包装在导航视图中

当tag的值变为2时,视图确实转到NextView(),但它也显示为一个模式表,用户可以从中向下滑动,我不希望出现这种情况

我想从模式工作表过渡到常规视图

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


对此问题的任何帮助都将不胜感激。

您可以通过创建
环境对象
并将
导航链接
目标值绑定到
环境对象
的值,然后在模式视图中更改
环境对象
的值

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

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"))
    }
}


希望这对您有所帮助,如果您对此代码有任何疑问,请告诉我。

因此,如果我理解正确,您有
视图A
,按下该按钮后会显示一个按钮
视图B
,显示为模式,但是当在
视图B
中按某个按钮时,您希望
视图A
导航到它吗?嗯,是的,我想这是一个很好的放置方式。就像我看到的那样,通过在NavigationView中包装模态工作表,从模型视图B转换到其他视图C(非模态),您将为其分配自己的UINavigationController,模态工作表中的所有导航链接都将由该控制器管理。最好在模式工作表上使用绑定变量来触发显示工作表的视图中的导航链接。但要使其工作,您可能需要首先排除模式表。