You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:16:26