I'm using the .sheet
modifier with a custom enum binding:
func sheet<Item, Content>(
item: Binding<Item?>,
onDismiss: (() -> Void)? = nil, @ViewBuilder content: @escaping (Item) -> Content
) -> some View where Item : Identifiable, Content : View
enum BottomSheetItem: Identifiable, Hashable {
case item1
case item2
var id: Self {
return self
}
}
The sheet is presented correctly when I initially set item = item1
. However, when I update the binding (while the sheet is still presented) to item = item2
, the app crashes due to
Thread 1: "Application tried to present modally a view controller <TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView: 0x1682a6c00> that is already being presented by <TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier_: 0x15c843a00>."
This behavior seems to incorrect according to apple docs:
If item changes, the system dismisses the sheet and replaces it with a new one using the same process
The expected correct behavior seems to be the sheet with item1
is dismissed and presented again with item2
.
Note: the above crash happens on iOS 16.4. I also tested with iOS 15.5, while the app does not crash when the binding value is updated, the sheet goes into an infinite loop of presenting and dismissing, which is also incorrect.
If I change the .sheet
modifier and use the .fullScreenCover
modifier it works as expected - when binding value is updated the full screen cover first dismisses then gets presented again with item2.
I am curious whether this is an apple bug or I am misunderstanding the docs and there is something wrong with my implementation. Any help would be appreciated!