I’m experiencing an issue on iOS 26.4 where nested .sheet presentations are automatically dismissed when the app goes to the background. I was able to reproduce similar case on iOS 26.2 but can’t build a minimal reproducible project out of the real one.
Minimal reproducible example
struct ContentView: View {
var body: some View {
TabView {
firstTabContent()
.tabItem {
Text("First tab")
}
}
}
private func firstTabContent() -> some View {
NavigationStack {
RootScreenView()
.navigationDestination(for: String.self) { string in
Text(string)
}
}
}
}
struct RootScreenView: View {
@State private var isSheetPresented: Bool = false
var body: some View {
VStack {
Text("Root screen view")
Button("Show sheet") {
isSheetPresented = true
}
}
.sheet(isPresented: $isSheetPresented) {
StubScreenView(level: 1)
}
}
}
struct StubScreenView: View {
let level: Int
@State private var isSheetPresented: Bool = false
var body: some View {
VStack {
Text("Level \(level)")
Button("Show sheet") {
isSheetPresented = true
}
}
.sheet(isPresented: $isSheetPresented) {
StubScreenView(level: level + 1)
}
}
}
Steps to reproduce
-
Launch the app
-
Tap “Show sheet” → level 1 sheet appears
-
Tap “Show sheet” again → level 2 sheet appears
-
Minimize the app (home screen or app switcher)
-
Return to the app
After returning to the app all sheets except the first one are collapsed without any animation.
What I’ve found
The issue requires the specific combination of TabView + NavigationStack + .navigationDestination. Any of the following changes prevent the issue:
-
Removing
.navigationDestination(for:)from the NavigationStack -
Removing the
TabViewwrapper -
Moving
.navigationDestinationbefore.sheetin the modifier chain onRootScreenView
This suggests the issue is related to how iOS 26.4 manages the UIKit presentation controller hierarchy during the background transition when these three elements interact. However, it’s quite common case if app uses modern SwiftUI navigation.
Environment
iOS 26.4
Xcode 26.2 and 26.4
Reproducible on both Simulator and physical device
Has anyone else encountered this or found a more robust workaround?