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
相关产品推荐
相关产品推荐

