[英]SwiftUI: sheet will not present with Picker appeared
可能是SwiftUI的bug? ContentView 中有一个 Picker 组件和两个按钮。 第一个按钮只是将“显示”var 更改为 true,第二个按钮延迟更改 var。 应通过点击按钮显示工作表。 但是我发现,如果首先点击选择器并且没有选择任何内容,那么只有延迟按钮才能显示工作表。 没有延迟的按钮会导致错误:
[Presentation] Attempt to present <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x14e80e400> on <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x14c819600> (from <_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x14c819600>) which is already presenting <_UIContextMenuActionsOnlyViewController: 0x14d63be90>.
之后,该工作表将永远无法再次呈现。 这是避免这种情况的唯一解决方案(增加延迟)吗?
import SwiftUI
struct ContentView: View {
@State var show = false
@State var picked = "1"
let values = ["1", "2", "3"]
var body: some View {
VStack {
Picker(selection: $picked, label: Text("")) {
ForEach (values, id: \.self) { value in
Text(value)
}
}
Text("⬆️ Tap me but don't select")
.padding(.bottom, 120)
Text("1. Tap Picker")
Text("2. Tap show sheet button")
Button("show sheet") {
show = false
show = true
}
.padding([.top, .bottom], 20)
Button("show sheet with delay") {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
show = true
}
}
}
.padding()
.sheet(isPresented: $show, content: {
Button("close") {
show = false
}
})
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
您遇到的问题是由于 SwiftUI 中的错误造成的,其中 Picker 组件可能会干扰工作表的显示。 众所周知,Picker 组件在某些情况下存在此问题。
您找到的解决方案在显示工作表之前添加延迟,允许 Picker 组件在显示工作表之前完成其内部处理,从而避免了冲突。
另一种解决方案是在显示工作表之前关闭 Picker 组件,这可以在 Picker 元素上使用resignKeyboard()
或endEditing(_:)
方法来完成。
此外,您可以尝试将 Picker 组件包装在Group
或VStack
或ZStack
中,看看它是否有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.