【问题标题】:SwiftUI DatePicker breaks sheet dismiss?SwiftUI DatePicker 打破工作表解雇?
【发布时间】:2022-01-21 15:03:09
【问题描述】:

场景:

  • RootScreen 通过.sheet 以模态方式呈现 DateScreen
  • DateScreen 有一个带有 CompactDatePickerStyle() 的 DatePicker 和一个关闭模式的按钮
  • 用户打开 DatePicker
  • 用户点击 DatePicker 以调出 NumPad 以进行手动键盘输入
  • 用户按下按钮关闭模式

SwiftUI 会认为 .sheet 被解除了,但实际上,只有 DatePicker 的模态被解除了。

最小代码示例:

struct DateScreen: View {
    @Binding var isPresented: Bool
    @State var date: Date = Date()

    var body: some View {
        NavigationView {
            VStack {
                DatePicker("", selection: $date, displayedComponents: [.hourAndMinute])
                    .datePickerStyle(CompactDatePickerStyle())
            }
            .navigationBarItems(leading: Button("Dismiss") {
                isPresented = false
            })
        }
    }
}

@main
struct Main: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    @State var isPresenting: Bool = false

    var body: some Scene {
        WindowGroup {
            Button("Present modal", action: {
                isPresenting = true
            })
                .sheet(isPresented: $isPresenting, content: {
                    DateScreen(isPresented: $isPresenting)
                })
        }
    }
}

显示损坏行为的 Gif:

注意,如果用户不打开 NumPad,它似乎可以正常工作。

【问题讨论】:

  • 可能与整个根视图控制器有关(一切都在那里)。如果您使用来自here.adaptiveSheet,则它可以正常工作。可能不是解决方案。

标签: ios swift swiftui


【解决方案1】:

我发现的唯一解决方法是忽略 SwiftUI 并返回到 UIKit 进行解雇。

我必须使用UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true),而不是isPresented = false

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2013-11-26
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多