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