从NavigationView(Xcode Beta 5)显示的SwiftUI模式表

从NavigationView(Xcode Beta 5)显示的SwiftUI模式表,swiftui,Swiftui,我试图排除通过SwiftUI中的.sheet显示的模式视图-由导航视图中的按钮调用,如下所示: struct ModalView : View { @Environment(\.presentationMode) var presentationMode var body: some View { Button(action: { self.presentationMode.value.dismiss()

我试图排除通过SwiftUI中的
.sheet
显示的模式视图-由
导航视图中的
按钮调用,如下所示:

struct ModalView : View {

    @Environment(\.presentationMode) var presentationMode  

    var body: some View {       
        Button(action: {
            self.presentationMode.value.dismiss()
        }, label: { Text("Save")})
    }   

}

struct ContentView : View {

    @State var showModal: Bool = false

    var body: some View {
         NavigationView { 
           Text("test")
           .navigationBarTitle(Text("Navigation Title Text"))
           .navigationBarItems(trailing:
               Button(action: {
                   self.showModal = true
               }, label: { Text("Add") })
                   .sheet(isPresented: $showModal, content: { ModalView() })
           )
        }
    }

}
点击Save(保存)按钮时,模式不会消失,它只会保留在屏幕上。摆脱它的唯一方法是在模态上向下滑动

打印
self.presentationMode.value的值
总是显示
false
,因此它似乎认为它没有被显示

这仅在从
导航视图中显示时发生。把它拿出来,就可以了


我是否遗漏了什么,或者这是测试版问题?

您需要将
.sheet
移到按钮外

NavigationView {
  Text("test")
  .navigationBarTitle(Text("Navigation Title Text"))
  .navigationBarItems(trailing:
     Button("Add") {
       self.showModal = true
     }
  )
  .sheet(isPresented: $showModal, content: { ModalView() })
}
您甚至可以将其移动到
导航视图
闭包之外

NavigationView {
  Text("test")
  .navigationBarTitle(Text("Navigation Title Text"))
  .navigationBarItems(trailing:
     Button("Add") { self.showModal = true }
  )
}
.sheet(isPresented: $showModal, content: { ModalView() })


请注意,如果您有一个简单的文本按钮,也可以简化按钮调用。

解决方案在文档中并不明显,大多数教程都选择简单的解决方案。但我真的希望在工作表的导航栏上有一个按钮,可以关闭工作表。以下是六个步骤的解决方案:

  • 将DetailView设置为不显示
  • 添加一个按钮以设置要显示的DetailView
  • 调用.sheet(isPresented)修改器以显示工作表
  • 包装将在NavigationView中的工作表中显示的视图,因为我们要显示.navigationBarItem按钮
  • 需要PresentationMode来关闭图纸视图
  • 在导航栏中添加一个按钮,并调用dismise方法
  • 导入快捷键

    struct ContentView: View {
        // 1
        @State private var showingDetail = false
        var body: some View {
            VStack {
                Text("Hello, world!")
                    .padding()
                Button("Show Detail") {
                    showingDetail = true // 2
                }
                // 3
                .sheet(isPresented: $showingDetail) {
                    // 4
                    NavigationView {
                        DetailView()
                    }
                }
            }
        }
    }
    
    struct ContentView_Previews: PreviewProvider {
        static var previews: some View {
            ContentView()
        }
    }
    
    
    struct DetailView: View {
        // 5
        @Environment(\.presentationMode) var presentationMode
        var body: some View {
            Text("Detail View!")
                // 6
                .navigationBarItems(leading: Button(action: {
                    presentationMode.wrappedValue.dismiss()
                }) {
                    Image(systemName: "x.circle")
                        .font(.headline)
                        .foregroundColor(.accentColor)
                })
        }
    }
    

    几天前,当我尝试类似的东西时,它出现过一次。我不认为您需要担心showModal,它是由sheet()重置的刚刚意识到我漏掉了问题中的一个关键句子-模态显示很好,但不会消失!哇,我不敢相信我没有尝试过。非常感谢!你能解释一下为什么它在按钮内时不工作吗?仍然有点不清楚。可能是一个bug,出于某种原因,导致了导航中的按钮ion bar的处理方式与在视图内部时不同。或者,可能navigationBar位于NavigationView外部,是它的兄弟。我现在想不出任何其他原因。很好的解决方法,但我想这也是一个缺陷,必须由苹果来处理