【问题标题】:SwiftUI transition from modal sheet to regular view with Navigation LinkSwiftUI 使用导航链接从模态表转换到常规视图
【发布时间】:2020-09-30 11:28:23
【问题描述】:

我正在使用 SwiftUI,并且我有一个起始页面。当用户按下此页面上的按钮时,会弹出一个模式表。

在模态表中,我有一些这样的代码:

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

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

当 tag 的值变为 2 时,视图确实转到 NextView(),但它也显示为用户可以向下滑动的模式表,我不希望这样。

我想从模态表转换到常规视图。

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

我们将不胜感激。

【问题讨论】:

  • 所以如果我理解正确,你有view A,按下它时有一个按钮View B 显示为模态,但是当按下View B 中的某些东西时,你希望View A 导航到是吗?
  • 嗯,是的,我想这是一个很好的表达方式。就像我看着离开模型视图 B 并转换到其他视图 C(非模态)
  • 通过将模式表包装在 NavigationView 中,您可以为其分配自己的 UINavigationController,并且模式表中的所有导航链接都将由该控制器管理。您可能会更好地使用模式表上的绑定变量来触发显示您的表的视图中的导航链接。但要使其正常工作,您可能需要先关闭模式表。

标签: ios swift swiftui modalviewcontroller ios-navigationview


【解决方案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"))
    }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2022-01-01
    • 2020-04-09
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多