Scenario:
- RootScreen presents DateScreen modally though
.sheet
- DateScreen has a DatePicker with CompactDatePickerStyle() and a button to dismiss the modal
- User opens the DatePicker
- User taps the DatePicker to bring up the NumPad for manual keyboard input
- User presses the button to dismiss the modal
SwiftUI will think the .sheet
got dismissed, but in reality, only the DatePicker's modal got dismissed.
Minimum code example:
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 showing the broken behavior:
Note, if the user doesn't open the NumPad, it seems to work well.