SwiftUI - 呈现工作表后导航栏按钮不可点击

Mar*_*tke 31 xcode swift swiftui

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

当我展示带有导航栏项目按钮的工作表然后关闭 ModalView 并返回到 ContentView 时,我发现自己无法再次单击导航栏项目按钮。

我的代码如下:

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")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Vah*_*yan 58

我认为发生这种情况是因为presentationMode不是从演示者视图继承的,所以演示者不知道模态已经关闭。您可以通过添加presentationMode到演示者来解决此问题,在本例中为 ContentView。

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")
                }
            )
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Xcode 12.5 上测试。

这是完整的工作 示例

  • 我是唯一一个这不起作用的人吗?有些水龙头根本没有被注册。我仍然确信这是一个 SwiftUI 错误,并且一位 Apple 工程师在 WWDC20 实验室会议上口头同意了这一点。我迫切需要一个解决方法。 (3认同)
  • 我也适用 - 我认为这不是苹果的预期行为,但在他们修复之前这是一个很好的解决方法。这应该是公认的答案。 (2认同)

Ral*_*ert 14

这似乎是 SwiftUI 中的一个错误。我还在 Xcode 11.5 / iOS 13.5.1 上看到了这个问题。navigationBarMode 没有任何区别。

我向苹果提出了一个问题:


FB7641003 - 有时无法识别显示工作表的导航栏项按钮

您可以使用附加的示例项目SwiftUISheet(也可以通过https://github.com/ralfebert/SwiftUISheet 获得)来重现该问题。它只是从导航栏按钮呈现一张表。运行应用程序并反复点击导航栏中的“加号”按钮。当工作表弹出时,向下滑动将其关闭。只会处理对按钮的一些点击,通常会忽略点击。

在 Xcode 11.4 (11E146) 和 iOS 13.4 (17E255) 上测试。

  • 我与一位 Apple 工程师举行了一次 WWDC 实验室会议,重点讨论了这个错误。工程师似乎口头上承认这似乎是一个错误,并且他在他的设备上注意到了同样的事情。我的反馈(提到 FB7641003)尚未得到回复或跟进。 (4认同)

ada*_*on5 7

非常老套,但这对我有用:

Button(action: {
    self.showSheet = true
}) {
    Text("SecondView")
    .frame(height: 96, alignment: .trailing)
}
Run Code Online (Sandbox Code Playgroud)


jol*_*guy 5

我在 Xcode 13 RC 和 iOS 15 中仍然遇到此问题。不幸的是,上述解决方案对我不起作用。我最终所做的是将一个小的文本视图添加到工具栏,其内容根据.showingSheet属性的值而变化。

struct ContentView: View {
    @State private var showingSheet = false

    var body: some View {
        NavigationView {
            VStack {
                Text("Content view")
                Text("Swift UI")
            }
            .sheet(isPresented: $showingSheet) {
                Text("This is a sheet")
            }
            .navigationTitle("Example")
            .toolbar {
                ToolbarItemGroup(placement: .navigationBarTrailing) {
                    // Text view workaround for SwiftUI bug
                    // Keep toolbar items tappable after dismissing sheet
                    Text(showingSheet ? " " : "").hidden()
                    Button(action: {
                        self.showingSheet = true
                    }) {
                        Label("Show Sheet", systemImage: "plus.square")
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我意识到这并不理想,但这是对我有用的第一件事。我的猜测是,根据属性改变文本.showingSheet视图的内容会强制 SwiftUI 完全刷新工具栏组。