【问题标题】: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

【问题讨论】:

    标签: swiftui


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2023-02-25
      • 2011-03-19
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2020-10-09
      • 2013-07-06
      • 2023-03-08
      相关资源
      最近更新 更多