Я пытаюсь создать представление SwiftUI, которое будет работать в качестве домашней страницы для приложения, которое я разрабатываю. Как часть этого, я хочу включить видную строку поиска в верхней части главной страницы. Однако, возможно, я немного запутался в том, как NavigationView
и TabBar
работают в SwiftUI, потому что панель поиска не исчезает, когда я перехожу на дочернюю страницу, как я хочу, чтобы она была для вас. Вот рисунок, демонстрирующий то, о чем я говорю:

После перехода к указанному c тестовому сообщению я хотел, чтобы панель поиска исчезла, но она сохранялась вверху страницы, в то время как вид в NavigationLink изменяется:
VStack(spacing: 0) {
HStack(spacing: 0) {
Image(systemName: "heart.fill")
.padding([.leading, .bottom, .trailing], 2.0)
.frame(width: 99, height: 99, alignment: .topLeading)
.aspectRatio(contentMode: .fill)
SearchBar(text: $searchTerm)
.edgesIgnoringSafeArea(.all)
}
// I only want all of this displayed within the parent view, the home page.
NavigationView {
List(categories.keys.sorted(), id: \String.self) {
// ... create the view
}
.navigationBarTitle(Text("SwiftUI Test"))
}
.onAppear{ // do stuff }
}
Вот пример кода, который создает панель инструментов внизу страницы, разделяя эту «домашнюю страницу» (озаглавленный FeedView ()) и другая страница, которая на данный момент не актуальна.
struct AppView: View {
var body: some View {
TabView {
FeedView()
.tabItem {
Image(systemName: "house.fill")
Text("Feed")
}
// other pages in the navbar
}.navigationBarBackButtonHidden(true)
}
}
В чем моя проблема? Как удалить панель поиска со всех страниц, которые не являются родительскими?
РЕДАКТИРОВАТЬ
После внесения изменений в Asperi я сталкиваюсь с новым вопрос. Мне пришлось создать несколько новых переменных @State
и @Binding
, чтобы передать их переменную showHeader
между двумя классами, и это немного медленное время отклика и правильная передача обновлений примерно половину времени. Взгляните:

И соответствующий код изменяется: (Родительское представление)
@State private var showHeader = true
var body: some View {
VStack(spacing: 0) {
if showHeader {
HStack(spacing: 0) {
// header
}
}
NavigationView {
List(categories.keys.sorted(), id: \String.self) {
key in CategoryRow(nameOfCategory: "\(key)".uppercased(), posts: self.posts[key]!, showHeader: self.$showHeader)
}
}
(Детское представление; CategoryRow элемент):
@Binding var showHeader: Bool
// ...
NavigationLink(destination: ExpandMediaView(post: post)
.onAppear { self.showHeader = false }
.onDisappear { self.showHeader = true }
)
Код иногда попадает только в часть .onDisappear
NavigationLink. Почему?