SwiftUI-出现工作表后,无法单击导航栏按钮

时间:2019-10-22 21:09:08

标签: swift xcode swiftui

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

6 个答案:

答案 0 :(得分:44)

我认为发生这种情况是因为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")
                }
            )
        }
    }
}

在Xcode 11.5上测试。

这是全部工作 example

答案 1 :(得分:13)

这似乎是SwiftUI中的错误。我还在Xcode 11.5 / iOS 13.5.1上仍然看到此问题。 navigationBarMode没有影响。

我向Apple提出了一个问题:


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

您可以使用随附的示例项目SwiftUISheet(也可以通过https://github.com/ralfebert/SwiftUISheet获得)来重现该问题。它只是通过导航栏按钮显示一个工作表。 运行该应用程序,然后反复点击导航栏中的“加号”按钮。弹出工作表时,请向下滑动以将其关闭。仅会点按该按钮几次,而经常会忽略一次点击。

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

答案 2 :(得分:5)

这是与.large navigationBarItem相关的错误。您可以将其设置为.inline来解决它:

    NavigationView {
        ,,,

        .navigationBarTitle(Text(""), displayMode: .inline)
    }

要查看错误:向下拖动按钮使其在.large模式下起作用;)

答案 3 :(得分:1)

到目前为止,我仍然可以在解散显示的页面后立即观察到导航按钮的混乱情况。

仅供参考,我使用UINavigationController包装器作为解决方法。效果很好。

不幸的是,我确信,越多的错误,ios开发人员广泛使用SwiftUI的时间就越远。因为这些太基础了,无法忽略。

答案 4 :(得分:0)

非常hacky,但这对我有用:

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

答案 5 :(得分:0)

非常hacky,但这对我有用:

我有同样的问题。这个解决方案对我有用。

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)
                }
            )
        }
    }
}