У меня есть родительское представление с 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 из дочернего представления... и я не смог найти решение.
Вам не нужны дополнительные 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
на 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)
}
}
Да, я уже пробовал без
NavigationStack
вChildView
, но это ничего не меняет, у меня все еще проблема с анимацией.