为什么一个选项卡视图中的工具栏显示在另一个选项卡视图中

问题描述 投票:0回答:1

我有一个 rootview,它将 tabbarview 包装在 navigationStack 中:

 NavigationStack {
                    TabbarView(showSignInView: $showSignInView)
                }

然后在 TabbarView 中,我有一个 tabView,它的每个项目都包装在 NavStack 中,现在的问题是我在 ProductsView 中有一个工具栏,它显示在其他不应该有工具栏的视图的顶部:

struct TabbarView: View {
    
    @Binding var showSignInView: Bool
    
    
    
    var body: some View {
        
        
        TabView {
            
            NavigationStack {
                ProductsView()
            }
            .tabItem {
                Image(systemName: "cart")
                Text("Products")
            }

            NavigationStack {
                FavoritesView()
            }
            .tabItem {
                Image(systemName: "star.fill")
                Text("Favourites")
            }
            
            NavigationStack{
                ProfileView(showSignInView: $showSignInView)
            }
            .tabItem {
                Image(systemName: "person")
                Text("Profile")
            }
            
            
        }
        
    }
}

到目前为止,我已经尝试删除每个选项卡项周围的导航堆栈,并删除 RootView 中的父级 navStack,但它不起作用,我还尝试为其他两个视图提供一个空工具栏,但这也不起作用。

swift swiftui
1个回答
0
投票

所以这似乎是 SwiftUI 中的一个错误,修复它的方法是首先删除 TabView 周围的 NavigationStack,然后删除选项卡栏项目周围的 NavigationStack:

   TabView {
                ProductsView()
            .tabItem {
                Image(systemName: "cart")
                Text("Products")
            }
               FavoritesView()
            
            .tabItem {
                Image(systemName: "star.fill")
                Text("Favourites")
            }
                ProfileView(showSignInView: $showSignInView)
          
            .tabItem {
                Image(systemName: "person")
                Text("Profile")
            }
     
    }

然后将这些 NavigationStack 移动到每个视图的主体内,如下所示:

struct ProfileView: View {
    
    @State private var viewModel = ProfileViewModel()
    @Binding var showSignInView: Bool
    let PreferenceOptions: [String] = ["Sports", "Movies", "Music"]
    
    private func preferenceIsSelected(_ text: String) -> Bool {
        return viewModel.user?.preferences?.contains(text) == true
    }
    
    var body: some View {
        NavigationStack {
            List {
                if let user = viewModel.user {
                    Text("Userid: \(user.userId)")
                }
                if let isAnomymous = viewModel.user?.isAnonymous {
                    Text("Anonymous: \(isAnomymous)")
                }
                
                Button {
                    //toggling the premium status in firebase Auth
                    viewModel.togglePremiumStatus()
                } label: {
                    Text("User is premium: \((viewModel.user?.isPremium ?? false).description.uppercased())")
                }
                
                VStack {
                    HStack {
                        ForEach(PreferenceOptions, id: \.self) {preference in
                            Button(preference) {
                                if preferenceIsSelected(preference) {
                                    viewModel.removeUserPreference(text: preference)
                                }
                                else {
                                    viewModel.addUserPreference(text: preference)
                                }
                            }
                            .font(.headline)
                            .buttonStyle(.borderedProminent)
                            .tint(preferenceIsSelected(preference) ? .green : .red)
                        }
                        
                    }
                    
                    Text("User preferences: \((viewModel.user?.preferences ?? []).joined (separator: ", "))")
                    
                }
                Button {
                    if viewModel.user?.favoriteMovie == nil {
                        viewModel.addFavoriteMovie()
                    }
                    else {
                        viewModel.removeFavoriteMovie()
                    }
                } label: {
                    Text("Favorite Movie: \(viewModel.user?.favoriteMovie?.title ?? "")")
                }
                
            }
        }
        .task {
            try? await viewModel.loadCurrentUser()
        }
        .navigationTitle("Profile")
        .toolbar {
            ToolbarItem(placement: .topBarTrailing) {
                NavigationLink {
                    SettingsView(showSignInView: $showSignInView)
                }
                label:  {
                    Image(systemName: "gear")
                        .font(.headline)
                }
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.