Swiftui 导航按钮可以';不排除模态
SwiftUI在Swiftui 导航按钮可以';不排除模态,swiftui,Swiftui,SwiftUI在.sheet上有我无法解决的意外行为。下面是一个简单的主视图>详细视图,它使用相同的模式。一个在NavigationView中,另一个在中。navigationBarItems中: struct MasterView: View { @State var showModal: Bool = false var modal: some View { ModalView(showModal: $showModal) } var body
.sheet
上有我无法解决的意外行为。下面是一个简单的主视图>详细视图,它使用相同的模式。一个在NavigationView
中,另一个在中。navigationBarItems
中:
struct MasterView: View {
@State var showModal: Bool = false
var modal: some View {
ModalView(showModal: $showModal)
}
var body: some View {
NavigationView {
VStack {
Button("Can be dismissed") { self.showModal = true }.sheet(isPresented: $showModal) { self.modal }
NavigationLink(destination: DetailView()) { Text("Can't be dismissed") }
}
}
}
}
struct DetailView: View {
@State var showModal: Bool = false
var modal: some View {
ModalView(showModal: $showModal)
}
var body: some View {
Text("Detail View")
.navigationBarItems(trailing: Button("Dismisss?") { self.showModal = true }.sheet(isPresented: $showModal) { self.modal })
}
}
struct ModalView: View {
@Binding var showModal: Bool
var body: some View {
VStack {
Text("Modal View")
Button("Dismiss") { self.showModal = false }
}
}
}
问题是,尽管可以通过MasterView
中的按钮
解除ModalView
,但不能通过详细视图中的导航项
解除
有人知道如何解除从.navigationBarItems
调用的.sheet
吗
编辑:有趣的是,如果你切换
Text("Detail View")
与
您会得到非常意外的结果,导致禁用.navigationBarItems
,除非通过拖动手势取消模式
编辑2:此行为现在已作为id为FB6891155的错误提交,这肯定会导致错误报告。起初,我认为使用@Environment(\.presentationMode)
可能会解决这个问题,但它绝对不会改变行为
我确实发现,如果您只有1张工作表
,则可以将模态设置为可忽略。也就是说,如果从详细视图中删除工作表
调用
struct MasterView: View {
@State var showModal: Bool = false
var modal: some View {
ModalView()
}
var body: some View {
NavigationView {
VStack {
Button("Can be dismissed") { self.showModal = true }.sheet(isPresented: $showModal) { self.modal }
NavigationLink(destination: DetailView(showModal: $showModal)) { Text("Can't be dismissed") }
}
}
}
}
struct DetailView: View {
@Binding var showModal: Bool
var body: some View {
Text("Detail View")
.navigationBarItems(trailing: Button("Dismisss?") { self.showModal = true })
}
}
struct ModalView: View {
@Environment(\.presentationMode) var showModal
var body: some View {
VStack {
Text("Modal View")
Button("Dismiss") {
self.showModal.value.dismiss()
}
}
}
}
虽然这确实使模式在编程上不可接受,但最终会遇到您提到的第二个错误,即.navigationBarItems
在您返回之前是禁用的
struct MasterView: View {
@State var showModal: Bool = false
var modal: some View {
ModalView()
}
var body: some View {
NavigationView {
VStack {
Button("Can be dismissed") { self.showModal = true }.sheet(isPresented: $showModal) { self.modal }
NavigationLink(destination: DetailView(showModal: $showModal)) { Text("Can't be dismissed") }
}
}
}
}
struct DetailView: View {
@Binding var showModal: Bool
var body: some View {
Text("Detail View")
.navigationBarItems(trailing: Button("Dismisss?") { self.showModal = true })
}
}
struct ModalView: View {
@Environment(\.presentationMode) var showModal
var body: some View {
VStack {
Text("Modal View")
Button("Dismiss") {
self.showModal.value.dismiss()
}
}
}
}