SwiftUI-工作表显示后导航栏按钮不可单击

SwiftUI-工作表显示后导航栏按钮不可单击,swift,xcode,swiftui,Swift,Xcode,Swiftui,几周前我刚刚开始使用SwiftUI,我正在学习。今天我遇到了一个问题 当我呈现一张带有navigationBarItems按钮的工作表,然后关闭ModalView并返回ContentView时,我发现自己无法再次单击navigationBarItems按钮 我的代码如下: struct ContentView: View { @State var showSheet = false var body: some View { NavigationView {

几周前我刚刚开始使用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")
            }
        }
    }
}

这似乎是SwiftUI中的一个bug。我还在Xcode 11.5/iOS 13.5.1中看到这个问题。导航栏模式没有什么不同

我向苹果公司提交了一份文件:


FB7641003-点击navigationBarItem按钮,显示有时无法识别的工作表

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


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

我认为这是因为
presentationMode
不是从presenter视图继承的,所以presenter不知道模式已经关闭。您可以通过将
presentationMode
添加到presenter(在本例中是添加到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")
                }
            )
        }
    }
}
在Xcode 11.5上测试

这是完整的工作流程
.

到目前为止,我仍然可以在翻开展示的页面后立即观察到navi按钮的混乱

仅供参考,我将使用UINavigationController包装作为解决方案。它运行良好


不幸的是,我确信这种bug越多,ios开发人员广泛使用SwiftUI的时间就越远。因为这些太基本了,不能忽略。

非常粗糙,但这对我来说很有用:

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

非常粗糙,但这对我有用:

Button(action: {
    self.showSheet = true
}) {
    Text("SecondView")
    .frame(height: 96, alignment: .trailing)
}
我也有同样的问题。这个解决方案对我有效

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")
                        // this is a workaround
                        .frame(height: 96, alignment: .trailing)
                }
            )
        }
    }
}

有什么最新消息吗?根据我的经验,如果我向下滑动以关闭视图,我可以点击按钮并将其重新打开。但是如果我点击工作表上的“完成”按钮退出,那么另一个导航项,+,就不起作用了。@LukeIrvin你有没有尝试过我提供的解决方案?FB上有更新,可以在iOS 13.5 Beta 4上重新测试(我目前在Beta版上没有设备,只是想让你保持更新)我也经历了同样的事情,仍然在13.5.1和Xcode 11.5(11E608c)上。我似乎有着与@LukeIrvin相反的问题,如果我点击我的“关闭”按钮,下次显示模式会更可靠,但向下滑动会使情况更糟。不过,我偶尔也会遇到这样的问题。我和一位苹果工程师在WWDC实验室进行了一次会议,讨论这个bug。工程师似乎口头承认这似乎是一个bug,他在他的设备上也注意到了同样的事情。我的反馈(提到FB7641003)没有得到回复或跟进。对我来说也很有效-我不认为这是苹果有意的行为,但在他们解决之前,这是一个很好的解决办法。这应该是公认的答案。非常好。在初次按下按钮后,我也无法点击加号按钮。这个解决方案对我有效。谢谢Sam我是唯一一个没用的人?有些水龙头根本没有注册。我仍然相信这是一个SwiftUI错误,我在WWDC20实验室的会议上得到了一位苹果工程师的口头同意。我迫切需要一个变通办法。@Jeremy这里是完整的工作示例,您可以将它复制到新项目中,它会工作的。我现在意识到我们谈论的是两个不同的bug。有了这个确切的代码,我仍然和@Ralf Ebert有同样的问题——很多时候,点击“SecondView”没有注册。我认为这是一个基本的SwiftUI错误。对于这段特定的代码,注释掉presentationMode行对我来说没有任何改变。在这两种情况下,它都会显示包含或不包含该行的工作表,并且按钮总是没有响应。Markus,你检查过我的答案了吗?它对你有用吗?哇!这一点在2021年WWDC的第一天仍然存在。也许是下一个版本。你有关于如何使用UINavigationController包装作为解决方法的链接吗?我想试试。