SwiftUI: вложенные листы закрываются на фоне приложения с помощью TabView + NavigationStack + .navigationDestination (iOIOS

Программируем под IOS
Ответить
Anonymous
 SwiftUI: вложенные листы закрываются на фоне приложения с помощью TabView + NavigationStack + .navigationDestination (iO

Сообщение Anonymous »

У меня возникла проблема в iOS 26.4, из-за которой вложенные презентации .sheet автоматически закрываются, когда приложение переходит в фоновый режим. Мне удалось воспроизвести аналогичный случай на iOS 26.2, но я не смог создать минимальный воспроизводимый проект на основе реального.
Минимально воспроизводимый пример

Код: Выделить всё

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)
}
}
}
Шаги по воспроизведению
  • Запустите приложение
  • Нажмите «Показать лист» → появится лист уровня 1.
  • Снова нажмите «Показать лист» → появится лист уровня 2.
  • Сверните приложение (главный экран или переключатель приложений)
  • Вернуться в приложение
После возврата в приложение все листы, кроме первого, сворачиваются без анимации.
Что я обнаружил
Для этой проблемы требуется определенная комбинация TabView + NavigationStack + .navigationDestination. Любое из следующих изменений предотвращает проблему:
  • Удаление .navigationDestination(for:) из NavigationStack
  • Удаление оболочки TabView
  • Перемещение .navigationDestination before .sheet в цепочке модификаторов RootScreenView
Это предполагает, что проблема связана с тем, как iOS 26.4 управляет иерархией контроллера представления UIKit во время фонового перехода, когда эти три элемента взаимодействуют. Однако это довольно распространенный случай, если приложение использует современную навигацию SwiftUI.
Среда
iOS 26.4

Xcode 26.2 и 26.4

Воспроизводится как на симуляторе, так и на физическом устройстве
Кто-нибудь еще сталкивался с этим или нашел более надежный обходной путь?

Подробнее здесь: https://stackoverflow.com/questions/798 ... gationstac
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»