几周前我刚刚开始使用SwiftUI,我正在学习.今天我遇到了一个问题.

当我展示一张带有navigationBarItems按钮的工作表,然后关闭ModalView并返回ContentView时,我发现自己无法再次单击navigationBarItems按钮.

我的代码如下:

struct ContentView: View {

    @State var showSheet = false

    var body: some View {
        NavigationView {
            VStack {
                Text("Test")
            }.sheet(isPresented: self.$showSheet) {
                ModalView()
            }.navigationBarItems(trailing:
                Button(action: {
                    self.showSheet = true
                }) {
                    Text("SecondView")
                }
            )
        }
    }
}

struct ModalView: View {

    @Environment(\.presentationMode) var presentation

    var body: some View {
        VStack {
            Button(action: {
                self.presentation.wrappedValue.dismiss()
            }) {
                Text("Dismiss")
            }
        }
    }
}

推荐答案

我认为这是因为presentationMode不是从presenter视图继承的,所以presenter不知道模式已经关闭.您可以通过向presenter(在本例中为ContentView)添加presentationMode来修复此问题.

struct ContentView: View {

    @Environment(\.presentationMode) var presentation
    @State var showSheet = false

    var body: some View {
        NavigationView {
            VStack {
                Text("Test")
            }.sheet(isPresented: self.$showSheet) {
                ModalView()
            }.navigationBarItems(trailing:
                Button(action: {
                    self.showSheet = true
                }) {
                    Text("SecondView")
                }
            )
        }
    }
}

在Xcode 12.5上测试.

以下是完整的工作流程

Swift相关问答推荐

通过withstickedContinuation传递通用类型T

如何将趋势线添加到线性图中?

如何取消正在视图修改器中运行的任务

在`NavigationStack`中使用`SafeAreaInset`修饰符时出现SwiftUI异常行为

将`@Environment`值赋给`Binding`参数

NSApplication是否需要NSApplicationDelegate?

为什么要在SWIFT RandomAccessCollection协议中重新定义元素类型?

如何才能在同一线程上调用类中的每个方法,而不对每个调用使用同步块?

Observable.create 捕获行为

如何在 Swift 中做类型安全的索引?

从 actor 的 init 方法调用方法

一组可散列的自定义元素插入相等的元素

更改该函数的参数之一时,如何将这些 SwiftUI 异步任务合并到一个任务中以从函数中获得正确的结果

Xcode 13.3 将函数调用更改为属性访问

无法使用锚激活约束

Swift中switch 盒的详尽条件

调整文本的字体大小以适应 UIButton

如何将多个枚举值作为函数参数传递

如何在swift中的每N个字符处为字符串添加分隔符?

通过单击表格视图中的单元格打开新的视图控制器 - Swift iOS