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

SwiftUI中使用UserDefaults存储登录用户名的实现方法及代码示例求助

在SwiftUI中用UserDefaults存储登录用户名的正确实现

首先,咱们先梳理下你代码里的几个小问题:

  • UserDefaults.standard.set(_:forKey:) 这个方法是没有返回值的,没法用它来判断是否存在存储的用户名,得用string(forKey:)来读取值做判断。
  • 你定义的private var Username是全局变量,没法和UserDefaults自动同步,SwiftUI里有更优雅的方式——@AppStorage属性包装器,它能自动帮你把值存在UserDefaults里,还能实时同步状态。
  • 视图切换逻辑也不对,login()和home()应该是具体的View类型,而不是直接调用方法。

接下来我给你完整的实现步骤和示例代码:

步骤1:用@AppStorage绑定用户名

@AppStorage是SwiftUI专门用来和UserDefaults交互的属性包装器,自动处理读写操作,不用手动调用UserDefaults的方法。我们可以在ContentView里定义它:

@AppStorage("Username") private var storedUsername: String?

这里的"Username"是UserDefaults里的键名,storedUsername是可选字符串,没有值时为nil,刚好用来判断用户是否登录。

步骤2:构建登录视图

登录视图需要输入框获取用户名,还有登录按钮,点击按钮时把输入的用户名存入@AppStorage:

struct LoginView: View {
    @AppStorage("Username") private var storedUsername: String?
    @State private var inputUsername = ""
    
    var body: some View {
        VStack(spacing: 20) {
            TextField("请输入用户名", text: $inputUsername)
                .textFieldStyle(.roundedBorder)
                .padding(.horizontal)
            
            Button("登录") {
                guard !inputUsername.isEmpty else { return }
                storedUsername = inputUsername
            }
            .buttonStyle(.borderedProminent)
        }
        .padding()
        .navigationTitle("登录")
    }
}

步骤3:构建首页视图

首页视图显示当前登录的用户名,还有退出登录按钮,点击退出时清空@AppStorage里的值:

struct HomeView: View {
    @AppStorage("Username") private var storedUsername: String?
    
    var body: some View {
        VStack(spacing: 20) {
            Text("欢迎回来,\(storedUsername ?? "")!")
                .font(.title)
            
            Button("退出登录") {
                storedUsername = nil
            }
            .buttonStyle(.bordered)
            .tint(.red)
        }
        .padding()
        .navigationTitle("首页")
    }
}

步骤4:在ContentView中做视图切换

根据storedUsername是否有值,决定显示登录视图还是首页视图:

struct ContentView: View {
    @AppStorage("Username") private var storedUsername: String?
    
    var body: some View {
        NavigationStack {
            if let username = storedUsername {
                HomeView()
            } else {
                LoginView()
            }
        }
    }
}

代码解释

  • @AppStorage会自动把storedUsername的值存在UserDefaults的"Username"键下,值变化时视图会自动刷新。
  • 登录时给storedUsername赋值,ContentView会自动切换到首页;退出时把storedUsername设为nil,又会切回登录页。
  • 用NavigationStack管理导航栏,符合SwiftUI的导航逻辑。

你可以直接把这段代码复制到项目里测试,就能实现你想要的功能啦~

内容的提问来源于stack exchange,提问作者VISAKH D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:07:36