Как удалить панель поиска из NavigationView в SwiftUI?

Я следовал этому руководству, чтобы добавить SearchBar в свое приложение SwiftUI: http://blog.eppz.eu/swiftui-search-bar-in-the-navigation-bar/ Он в основном использует настраиваемый модификатор для добавления SearchBar в NavigationView:

extension View {
    
    func add(_ searchBar: SearchBar) -> some View {
        return self.modifier(SearchBarModifier(searchBar: searchBar))
    }
}

Поскольку я мой NavigationView оборачиваю TabView, и я хочу отображать SearchBar только на указанной вкладке (например, вторая вкладка имеет SearchBar, а другие нет). Я хотел бы скрыть или удалить представление searchBar, но не нашел способа сделать это. Пожалуйста помоги

Вот как я оборачиваю NavigationView за пределами TabView:

struct MainView: View {
    @ObservedObject var searchBar = SearchBar()
    @State private var selectedTab :Int = 0
    private var pageTitles = ["Home", "Customers","Sales", "More"]
    
    
    var body: some View {
        NavigationView{
            TabView(selection: $selectedTab, content:{
                HomeView()
                    .tabItem {
                        Image(systemName: "house.fill")
                        Text(pageTitles[0])
                    }.tag(0)
                CustomerListView(searchText: searchBar.text)
                    .tabItem {
                        Image(systemName: "rectangle.stack.person.crop.fill")
                        Text(pageTitles[1])
                    }.tag(1)
                SaleView()
                    .tabItem {
                        Image(systemName: "tag.fill")
                        Text(pageTitles[2])
                    }.tag(2)
                
                MoreView()
                    .tabItem {
                        Image(systemName: "ellipsis.circle.fill")
                        Text(pageTitles[3])
                    }.tag(3)
            })
            .add(searchBar, when: selectedTab == 1)            
        }
    }
}


//Compile error: Function declares an opaque return type, but the return statements in its body do not have matching underlying types
    extension View {
        func add(_ searchBar: SearchBar, when: Bool) -> some View {
            if(when == true)
                return self.modifier(SearchBarModifier(searchBar: searchBar))
            else
                return self
        }
    }

person Nguyen Minh Binh    schedule 22.04.2021    source источник


Ответы (1)


Попробуйте сделать так, чтобы он отображал построитель (или оберните условие в Group {})

extension View {

    @ViewBuilder
    func add(_ searchBar: SearchBar, when: Bool) -> some View {
        if when == true {
           self.modifier(SearchBarModifier(searchBar: searchBar))
        } else {
           self
        }
    }
}
person Asperi    schedule 22.04.2021
comment
приложение можно скомпилировать и запустить, но SearchBar все еще отображается на других вкладках. когда он добавлен в NavigationView, он кажется там постоянно видимым - person Nguyen Minh Binh; 22.04.2021