UserDefaults 是一个轻量级的本地存储机制,可用于保存应用程序的偏好设置、用户授权状态等。
在 SwiftUI 中使用 UserDefaults 非常简单,下面是使用 UserDefaults 的详细步骤和代码演示:
- 定义默认值
首先,我们需要为存储在 UserDefaults 中的值定义默认值。为此,我们可以使用 Swift 中的 Dictionary 类型,并将其保存为静态成员变量。
struct UserDefaultsManager {
static let defaults = UserDefaults.standard
static let defaultValues: [String: Any] = [
"username": "",
"password": "",
"isRememberMeOn": false
]
}
在上面的代码中,我们定义了三个默认值:用户名、密码和一个布尔值,用于指示是否要记住用户的登录信息。默认情况下,这些值都不应该存在,因此我们将其设置为空字符串和 false。
- 读/写数据
一旦定义了默认值,我们就可以开始读/写数据了。在 SwiftUI 中,可以使用 @AppStorage 或 @SceneStorage property wrappers 来轻松读写 UserDefaults 数据。
struct ContentView: View {
@AppStorage("username", store: UserDefaultsManager.defaults) var username: String = UserDefaultsManager.defaultValues["username"] as! String
@AppStorage("password", store: UserDefaultsManager.defaults) var password: String = UserDefaultsManager.defaultValues["password"] as! String
@AppStorage("isRememberMeOn", store: UserDefaultsManager.defaults) var isRememberMeOn: Bool = UserDefaultsManager.defaultValues["isRememberMeOn"] as! Bool
var body: some View {
VStack {
TextField("Username", text: $username)
SecureField("Password", text: $password)
Toggle("Remember Me", isOn: $isRememberMeOn)
Button("Save") {
UserDefaultsManager.defaults.setValue(username, forKey: "username")
UserDefaultsManager.defaults.setValue(password, forKey: "password")
UserDefaultsManager.defaults.setValue(isRememberMeOn, forKey: "isRememberMeOn")
}
}
}
}
在上面的代码中,我们通过使用 @AppStorage 和 UserDefaults 实例来读取和写入数据。注意,在读取数据时,我们还需要使用默认值,以确保在没有存储任何值时返回正确的值。
此外,在点击“保存”按钮时,我们还可以使用 UserDefaults 的 setValue(_:forKey:) 方法直接将数据写入 UserDefaults 中。
- 更新界面
最后,我们还需要确保当数据存储更改时,界面可以及时更新。对于普通的 SwiftUI View,我们可以通过将需要更新的值绑定到 @State 或 @Binding 属性来实现。
struct ContentView: View {
@AppStorage("username", store: UserDefaultsManager.defaults) var username: String = UserDefaultsManager.defaultValues["username"] as! String
@AppStorage("password", store: UserDefaultsManager.defaults) var password: String = UserDefaultsManager.defaultValues["password"] as! String
@AppStorage("isRememberMeOn", store: UserDefaultsManager.defaults) var isRememberMeOn: Bool = UserDefaultsManager.defaultValues["isRememberMeOn"] as! Bool
@State private var isLoggedIn: Bool = false
var body: some View {
if isLoggedIn {
Text("Welcome, \(username)!")
} else {
VStack {
TextField("Username", text: $username)
SecureField("Password", text: $password)
Toggle("Remember Me", isOn: $isRememberMeOn)
Button("Login") {
isLoggedIn = true
UserDefaultsManager.defaults.setValue(username, forKey: "username")
UserDefaultsManager.defaults.setValue(password, forKey: "password")
UserDefaultsManager.defaults.setValue(isRememberMeOn, forKey: "isRememberMeOn")
}
}
}
}
}
在上面的代码中,我们使用一个简单的布尔值(isLoggedIn)来切换视图状态。如果用户已登录,则显示欢迎消息,否则显示登录表单。
当用户点击“登录”按钮并成功登录时,我们将 isLoggedIn 属性设置为 true,并使用 UserDefaults 存储用户输入的值。这将导致界面重新构建,并切换视图状态。
总结
通过使用 @AppStorage 和 UserDefaults 实例,我们可以轻松读取和写入 UserDefaults 数据。在读取数据时,我们还需要使用默认值来确保在没有存储任何值时返回正确的数据。最后,我们可以使用 @State 或 @Binding 属性来将 UserDefaults 数据绑定到视图状态,以便在存储更改时更新界面。