这里有三个视图,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
如果您按照评论中的建议重新组织层次结构并将
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()
}
}