在 SwiftUI 中,当 MyView 弹出表关闭时,应该显示 MyView 而不是 ListView

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

这里有三个视图,ContentView、ListView 和 MyView。点击第一个底部图标显示 ListView,然后点击 NavigationLink 显示 MyView。点击按钮显示表单,关闭 ListView 在屏幕上显示的表单。


struct ContentView: View {
    var body: some View {
        NavigationView {
            TabView {
                ListView().tabItem {
                        Label("list view", systemImage: "face.smiling")
                    }
                Text("list 2 content").tabItem {
                    Label("text", systemImage: "face.smiling")
                }
            }
        }
    }
}

struct ListView: View {
    var body: some View {
        ScrollView(.vertical, showsIndicators: false) {
            LazyHStack(alignment: .top) {
                LazyVStack {
                    NavigationLink(destination: MyView()) {
                        Text("test")
                    }
                }
            }
        }
    }
}

struct MyView: View {
    @State private var isShowingSheet = false
    @Environment(\.presentationMode) var presentationMode
    var body: some View {
        Button(action: {
            isShowingSheet.toggle()
        }) {
            Text("Show Sheet")
        }
        .sheet(isPresented: $isShowingSheet,
               onDismiss: didDismiss)
        {
            VStack {
                Text("License Agreement")
                    .font(.title)
                    .padding(50)
                Text("""
                    Terms and conditions go here.
                """)
                .padding(50)
                Button("Dismiss",
                       action: { isShowingSheet.toggle() })
            }
        }
    }

    func didDismiss() {
        presentationMode.wrappedValue.dismiss()
    }
}

在MyView表单中关闭,应该显示MyView

ios swift swiftui navigationview swiftui-sheet
1个回答
0
投票

如果您按照评论中的建议重新组织层次结构并将

NavigationView
放在
TabView
内,而不是反之亦然,这对我有用。

工作表消失后,可以再次看到

MyView
。但是,由于工作表上有
ListView
修饰符,它会立即导航回
.onDismiss
。因此,如果您不想让它向后导航(也许是为了测试),请去掉
.onDismiss
,或注释掉
didDismiss
的正文:

struct ContentView: View {
    var body: some View {
        TabView {
            NavigationView {
                ListView()
            }
            .tabItem {
                Label("list view", systemImage: "face.smiling")
            }
            Text(
                "list 2 content"
            )
            .tabItem {
                Label("text", systemImage: "face.smiling")
            }
        }
    }
}

struct ListView: View {
    var body: some View {
        VStack {
            Text("ListView").font(.largeTitle)
            ScrollView(.vertical, showsIndicators: false) {
                LazyHStack(alignment: .top) {
                    LazyVStack {
                        NavigationLink(destination: MyView()) {
                            Text("Go to MyView")
                        }
                    }
                }
            }
        }
    }
}

struct MyView: View {
    @State private var isShowingSheet = false
    @Environment(\.presentationMode) var presentationMode
    var body: some View {
        VStack {
            Text("MyView").font(.largeTitle)
            Spacer()
            Button("Show Sheet") { isShowingSheet.toggle() }
            Spacer()
        }
        .sheet(isPresented: $isShowingSheet, onDismiss: didDismiss) {
            VStack {
                Text("License Agreement")
                    .font(.title)
                    .padding(50)
                Text("""
                Terms and conditions go here.
            """)
                .padding(50)
                Button("Dismiss") { isShowingSheet.toggle() }
            }
        }
    }

    func didDismiss() {
        // Don't navigate back
        // presentationMode.wrappedValue.dismiss()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.