导航按钮无法关闭模式

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

【讨论】:

以上是关于导航按钮无法关闭模式的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 模式表在关闭后重新打开

几次导航后如何关闭原生脚本模式?

点击按钮时无法关闭模式视图

使用 Swift 4 关闭 iOS 中的所有模式

iOS 16.2 在 SwiftUI 子视图中无法关闭弹出的(sheet)导航视图(NavigationView)之解决

单击导航条折叠/关闭