我似乎在 SwiftUI 中错误地使用了(上下文)菜单(或者存在严重的错误):
当菜单打开并且用户点击后台中应该打开工作表的另一个按钮 (⛭) 时,菜单会自动关闭,但不会显示工作表。
更糟糕的是:在那之后,我可以根据需要多次点击按钮,但仍然没有任何反应。相反,以下警告会打印到日志中(仅第一次):
[演示]尝试演示 <TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x105818200> 上 <TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier_: 0x10601e000>(来自 <TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier_: 0x10601e000>) 已经呈现 <_UIContextMenuActionsOnlyViewController: 0x107308e30>.
显然,SwiftUI 将菜单呈现为引擎盖下的模态视图以及设置视图,但 UIKit 无法同时呈现两个模态。虽然了解这个问题,但我不确定如何解决它:
一种方法是完全禁用后台的用户交互(即不属于菜单的所有内容)。但我无法找到可靠的方法来做到这一点,甚至无法检测菜单何时打开。 这是我找到的解决方案的最佳尝试。还有更好的吗
struct ContentView: View {
@State private var displaySettings: Bool = false
var body: some View {
Button {
displaySettings = true
} label: {
Image(systemName: "gearshape.fill")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 50)
}
.toolbar {
ToolbarItem(placement: .bottomBar) {
Menu {
Button(action: {}) {
Label("Reset", systemImage: "arrow.counterclockwise")
}
} label: {
Image(systemName: "ellipsis.circle")
}
}
}
.sheet(isPresented: $displaySettings) {
Text("Settings")
}
}
}
⚠️ 请注意,该问题仅发生在真实设备上。模拟器没有这个问题并按预期显示工作表。