Удаление элемента пользовательского интерфейса из дочернего представления SwiftUI - PullRequest
2 голосов
/ 05 февраля 2020

Я пытаюсь создать представление 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 между двумя классами, и это немного медленное время отклика и правильная передача обновлений примерно половину времени. Взгляните:

broken

И соответствующий код изменяется: (Родительское представление)

@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. Почему?

1 Ответ

1 голос
/ 05 февраля 2020

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

Таким образом, подход Для достижения вашей цели может быть следующее (схематично, так как предоставленный код не подлежит тестированию)

@State private var showHeader = true // << add conditional state for header
...
VStack(spacing: 0) {
    if showHeader { // << present header conditionally
      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
            NavigationLink(destination: 
               YourDestinationView()
                  .onAppear { self.showHeader = false } // << hide header
                  .onDisappear { self.showHeader = true } // << show header
            ) { 
              // ... label here
            }
        }
        .navigationBarTitle(Text("SwiftUI Test"))
    }
    .onAppear{ // do stuff }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...