我有一个 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,但它不起作用,我还尝试为其他两个视图提供一个空工具栏,但这也不起作用。
所以这似乎是 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)
}
}
}
}