繁体   English   中英

SwiftUI:工作表不会随选择器一起出现

[英]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 组件包装在GroupVStackZStack中,看看它是否有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM