Динамически устанавливать SwiftUI NavigationBarItems?

Как можно динамически изменять элементы панели навигации SwiftUI?

У меня есть TabView в NavigationView, и я хотел бы, чтобы элементы панели навигации менялись в зависимости от выбранной вкладки. Однако мне трудно определить, как это изменить с помощью.onAppear(), если предположить, что это даже то, что вы должны делать.

В настоящее время мой код выглядит следующим образом:

var body: some View {
        NavigationView {
            TabView {
                contentWithNavigationButtons()
                    .tabItem {
                        Image(systemName: "house")
                        Text("Buttons")
                    }
                
                contentWithoutNavigationButtons()
                    .tabItem {
                        Image(systemName: "person")
                        Text("No Buttons")
                    }
                    .onAppear {
                        //Navigation Bar Items should be removed
                    }
                
            }
            .navigationBarItems(trailing: someButton)
        }

1 ответ

Решение

Вот демонстрация возможного решения - добавить отслеживание выбора для вкладок и сделать кнопку в зависимости от выбора вкладки. Протестировано с Xcode 12 / iOS 14

struct DemoView: View {
    @State private var selection = 0    // << here !!
    var body: some View {
        NavigationView {
            TabView(selection: $selection) {
                contentWithNavigationButtons()
                    .tabItem {
                        Image(systemName: "house")
                        Text("Buttons")
                    }.tag(0)                // << here !!
                
                contentWithoutNavigationButtons()
                    .tabItem {
                        Image(systemName: "person")
                        Text("No Buttons")
                    }.tag(1)
                
            }
            .navigationBarItems(trailing: Group {
                if selection == 0 {     // << here !!
                    Button("Some"){}
                }
            })
        }
    }
}
Другие вопросы по тегам