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 上测试。
这是完整的工作 示例。
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) 上测试。
非常老套,但这对我有用:
Button(action: {
self.showSheet = true
}) {
Text("SecondView")
.frame(height: 96, alignment: .trailing)
}
Run Code Online (Sandbox Code Playgroud)
我在 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 完全刷新工具栏组。