Проблема с анимацией SwiftUI NavigationStack при возврате к родительскому представлению

У меня есть родительское представление с NavigationStack, содержащим список с NavigationLinks, у NavigationStack большой заголовок.

Эти NavLinks ведут к другому List с Sections в нем, у этого List есть встроенный заголовок.

Проблема возникает при возврате к родительскому виду, заголовок NavigationStack's отображается как .inline на полсекунды, а затем возвращается к месту заголовка .large.

Вот мой родительский взгляд:

struct TeamsView: View {
    var body: some View {
        NavigationStack {
            List {
                Section {
                    NavigationLink {
                        ChildView()
                    } label: {
                        Text("Test")
                    }
                }
            }
            .navigationTitle("Title 1")
            .navigationBarTitleDisplayMode(.large)
        }
    }
}

Детский вид:

struct ChildView: View {
    var body: some View {
         List {
              Section {
                  //...
              }
              Section {
                  //...
              }
         }
         .navigationTitle("Title 2")
         .navigationBarTitleDisplayMode(.inline)
     }
}

А вот и GIF-анимация проблемы с анимацией:

Я провел несколько тестов с различными устройствами-симуляторами, реальным устройством, чтобы изменить, где .navigationTitle применяется как в родительском, так и в дочернем представлении, чтобы удалить NavStack из дочернего представления... и я не смог найти решение.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
205
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не нужны дополнительные NavigationStack внутри ChildView. Его включение приводит к созданию новой панели навигации при нажатии и уничтожению при возврате, поэтому система рисования SwiftUI неправильно связывает кнопку «Назад» с заголовком в родительском представлении.

struct ChildView: View {
    var body: some View {
        List {
            Section {
                //...
            }
            Section {
                //...
            }
        }
        .navigationTitle("Title 2")
        .navigationBarTitleDisplayMode(.inline)
    }
}

Это означает, что предварительный просмотр для ChildView будет выглядеть странно, поскольку по умолчанию он больше не находится в собственном стеке навигации. Вы можете исправить это, добавив стек в код предварительного просмотра. Например:

struct ChildView_Previews: PreviewProvider {
  static var previews: some View {
    NavigationStack {
      ChildView()
    }
  }
}

Да, я уже пробовал без NavigationStack в ChildView, но это ничего не меняет, у меня все еще проблема с анимацией.

simsab 22.04.2023 21:36
Ответ принят как подходящий

Изменение NavigationStack на NavigationView в родительском представлении решило мою проблему, я не могу понять почему, но это сработало.

Родительский вид:

struct TeamsView: View {
    var body: some View {
        NavigationView {
            List {
                Section {
                    NavigationLink {
                        ChildView()
                    } label: {
                        Text("Test")
                    }
                }
            }
            .navigationTitle("Title 1")
            .navigationBarTitleDisplayMode(.large)
        }
    }
}

Детский вид:

struct ChildView: View {
    var body: some View {
        List {
            Section {
                Text("test")
            }
            Section {
                Text("test2")
            }
        }
        .navigationTitle("Title2")
        .navigationBarTitleDisplayMode(.inline)
    }
}

Другие вопросы по теме

UIViewRepresentable: нельзя использовать изменяющийся член для неизменяемого значения: «я» неизменяемо
Почему я получаю сообщение об ошибке в Xcode «неопознанный селектор, отправленный в класс» в моем проекте приложения Swift для iOS?
Как правильно перевести код C в UnsafeSwift
Отслеживание показов в iOS
В XCUITest невозможно нажать() на коммутаторе
Переключатель SwiftUI не переключается в тесте пользовательского интерфейса
Исключить методы уведомления для tvOS с помощью @available
Swift/SwiftUI Попытка передать массив из одного представления в другое, который ошибочно помечен как нулевой
Неустранимая ошибка: не найден ObservableObject типа IconNames. View.environmentObject(_:) для IconNames может отсутствовать как предок этого представления
Приложение вылетает при попытке закодировать пользовательские объекты, которые соответствуют кодируемому протоколу, и я не могу понять, почему, какие-нибудь мысли?

Похожие вопросы

Отслеживание показов в iOS
Публикация Expo не обновляется после отправки сборки — ios
В XCUITest невозможно нажать() на коммутаторе
Исключить методы уведомления для tvOS с помощью @available
Swift/SwiftUI Попытка передать массив из одного представления в другое, который ошибочно помечен как нулевой
Не могу получить облачное сообщение Firebase (без уведомления) на ios на переднем плане в игре единства
Приложение SwiftUI для iPad открывается в полноэкранном режиме (как и ожидалось) при предварительном просмотре, но в симуляторе открывается в свернутом виде на боковой панели
Панель вкладок SwiftUI, которая размывает содержимое позади нее
Как я могу получить представление SwiftUI для отображения элементов в хронологическом порядке и сохранения привязок?
Сборка EAS (облачная, а не локальная): проблема с версией SDK — это приложение было создано с помощью SDK iOS 15.5