gpt4 book ai didi

ios - 如何在 SwiftUI 中关闭选项卡 View Root View 的呈现 View ?

转载 作者:行者123 更新时间:2023-12-04 11:26:08 31 4
gpt4 key购买 nike

我正在使用 TabView在我的主页上。假设我有 4 个标签。
在第二个选项卡上,我可以使用 NavigationLink 转到另一个 View 然后我使用 NavigationLink 转到另外 2 个 View .然后在最新的 View 上,有一个按钮来呈现 View ,我使用 .fullScreenCover (因为我想全屏显示)。
在呈现 View 中,我添加了 X navigationBarItems 左侧的标记解雇。我用 @Environment(\.presentationMode) var presentationModepresentationMode.wrappedValue.dismiss()解雇。但它只是将呈现 View 关闭到前一个 View ,而实际上我想将它关闭到我的 View 的根,这是我的 TabView 的第二个选项卡.
有没有办法做到这一点?因为我查了一些文章,特别是在TabView中没有任何相关的内容。语境。
我也有一个问题:

  • 使用方法是否正确 .fullScreenCover ?或者是否有另一种可能的解决方案,例如以全屏样式呈现模态(如果有任何原因,我也不确定)。

  • 任何建议将不胜感激,提前谢谢。

    最佳答案

    presentationMode是一级效果值,即更改它会关闭当前显示的一个屏幕。
    因此,要关闭许多呈现的屏幕,您必须以编程方式实现这一点,如下面的演示所示。
    可能的方法是使用自定义 EnvironmentKey将它向下传递到 View 层次结构,而没有每个级别 View 的紧密耦合(如绑定(bind)),并仅在需要的那个级别注入(inject)/调用。
    使用 Xcode 12.4/iOS 14.4 测试的演示
    demo

    struct ContentView: View {
    var body: some View {
    TabView {
    Text("Tab1")
    .tabItem { Image(systemName: "1.square") }
    Tab2RootView()
    .tabItem { Image(systemName: "2.square") }
    }
    }
    }

    struct Tab2RootView: View {
    @State var toRoot = false
    var body: some View {
    NavigationView {
    Tab2NoteView(level: 0)
    .id(toRoot) // << reset to root !!
    }
    .environment(\.rewind, $toRoot) // << inject here !!
    }
    }

    struct Tab2NoteView: View {
    @Environment(\.rewind) var rewind
    let level: Int

    @State private var showFullScreen = false
    var body: some View {
    VStack {
    Text(level == 0 ? "ROOT" : "Level \(level)")
    NavigationLink("Go Next", destination: Tab2NoteView(level: level + 1))
    Divider()
    Button("Full Screen") { showFullScreen.toggle() }
    .fullScreenCover(isPresented: $showFullScreen,
    onDismiss: { rewind.wrappedValue.toggle() }) {
    Tab2FullScreenView()
    }
    }
    }
    }

    struct RewindKey: EnvironmentKey {
    static let defaultValue: Binding<Bool> = .constant(false)
    }

    extension EnvironmentValues {
    var rewind: Binding<Bool> {
    get { self[RewindKey.self] }
    set { self[RewindKey.self] = newValue }
    }
    }

    struct Tab2FullScreenView: View {
    @Environment(\.presentationMode) var mode

    var body: some View {
    Button("Close") { mode.wrappedValue.dismiss() }
    }
    }

    关于ios - 如何在 SwiftUI 中关闭选项卡 View Root View 的呈现 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67014293/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com