导航按钮无法关闭模式
Posted
技术标签:
【中文标题】导航按钮无法关闭模式【英文标题】:Navigation Button Can't Dismiss Modal 【发布时间】:2019-08-01 13:53:44 【问题描述】:SwiftUI 对.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
问题是,尽管ModalView
可以从MasterView
中的Button
中消除,但它不能用DetailView
中的.navigationBarItems
消除
有人知道如何关闭从.navigationBarItems
调用的.sheet
吗?
编辑:有趣的是,如果你切换
Text("Detail View")
与
Button("Can Dismiss") self.showModal = true .sheet(isPresented: $showModal) self.modal
您会得到非常意外的结果,导致 .navigationBarItems
被禁用,除非通过拖动手势关闭模式
编辑 2:此行为现在已作为错误提交,ID 为:FB6891155
【问题讨论】:
【参考方案1】:这绝对值得一个错误报告。最初我认为使用@Environment(\.presentationMode)
可能会解决这个问题,但它绝对不会改变行为。
我确实发现,如果你只有 1 个sheet
,你可以让模态被解雇。 IE。如果您从DetailView
中删除sheet
呼叫。
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
被禁用,直到您返回 SwiftUI button in navigation bar only works once
【讨论】:
以上是关于导航按钮无法关闭模式的主要内容,如果未能解决你的问题,请参考以下文章
iOS 16.2 在 SwiftUI 子视图中无法关闭弹出的(sheet)导航视图(NavigationView)之解决