Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swiftui 导航按钮可以';不排除模态_Swiftui - Fatal编程技术网

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

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 }
        }
    }
}
问题是,尽管可以通过
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()
            }
        }
    }
}