SwiftUI登出跳转登录页后底部工具栏无法隐藏问题求助
问题分析
你的底部工具栏始终显示的核心原因是:它是主视图VStack的固定子视图,登出时用NavigationLink只是在现有导航栈上push了LoginView,主视图仍留在栈底,因此工具栏会一直显示。
解决方案
方案一:基于登录状态动态隐藏工具栏
利用你已经在使用的UserDefaults存储的登录状态,直接控制工具栏的显示与否,实现最简单的隐藏逻辑:
修改主视图代码
// 用@AppStorage简化UserDefaults的读取/监听 @AppStorage("isLogin") private var isLogin = true var body: some View{ VStack(spacing: 0){ ZStack{ switch selectedIndex{ case 0: MeniuListView() default: ProfileShopView() } } // 仅在登录状态下显示底部工具栏 if isLogin { Divider() HStack{ ForEach(0..<2, id: \.self){number in Spacer() Button(action: { self.selectedIndex = number }, label: { VStack(spacing: 3){ Image(systemName: icons[number]) .font(.system(size: 25, weight: .regular)) // 修正选中状态判断(原代码number==2超出0..<2的范围) .foregroundColor(number == selectedIndex ? .blue : .gray) } }) Spacer() } } } } }
方案二:替换根视图(彻底移除主视图)
如果需要登出后完全切断返回主视图的路径,直接将LoginView设为新的根视图,主视图会被销毁,工具栏自然消失:
1. 创建全局状态管理器
class AppState: ObservableObject { // 初始化时读取本地存储的登录状态 @Published var isLogin = UserDefaults.standard.bool(forKey: "isLogin") }
2. 在App入口注入状态
@main struct YourAppName: App { @StateObject private var appState = AppState() var body: some Scene { WindowGroup { // 根据登录状态切换根视图 if appState.isLogin { MainView() .environmentObject(appState) } else { LoginView() } } } }
3. 修改ProfileShopView的登出逻辑
// 接收全局状态 @EnvironmentObject private var appState: AppState var body: some View { // 移除多余的NavigationView(根视图已处理导航逻辑) VStack{ Form{ TextField("Name", value: $restaurantMobile, formatter: NumberFormatter()) TextField("Name2", value: $price, formatter: NumberFormatter()) .keyboardType(.decimalPad) } Button(action: { // 更新全局登录状态,触发根视图切换 appState.isLogin = false UserDefaults.standard.set(false, forKey: "isLogin") }) { Text("登出") } } }
原代码注意事项
- 原
ProfileShopView存在语法错误:Form内多余闭包、Button未闭合括号,需修正后才能正常运行 - 原工具栏选中状态判断
number == 2超出0..<2的循环范围,永远不会触发高亮,已在方案一中修正
内容的提问来源于stack exchange,提问作者user20468094
相关产品推荐
相关产品推荐

