不确定这是一个错误还是什么 . 我有两个不同的值,我想在userDefaults中设置,一个是 isLoggedIn
状态,另一个是 isOwner
状态,这是一个优先级/权限 .
当用户首次登录时,一切正常 . 如果用户是所有者并且已登录,则两种状态都保存在控制台内 . 已调用 print(UserDefaults.standard.dictionaryRepresentation())
并且它们都打印到控制台 .
我可以使用该应用程序,但它工作正常 . 然而,如果我强行崩溃应用程序(双击主页按钮并删除应用程序在后台运行),其中一个状态最终会被删除 . 它可以是任何一种状态,迫使应用程序变得越来越多 .
这是一个错误吗?我怎么能避免这个?
extension UserDefaults {
enum UserDefaultsKeys: String {
case isOwner
case isLoggedIn
case latitude
case longitude
}
func setIsOwner(value: Bool) {
set(value, forKey: UserDefaultsKeys.isOwner.rawValue)
synchronize()
}
func setIsLoggedIn(value: Bool) {
set(value, forKey: UserDefaultsKeys.isLoggedIn.rawValue)
synchronize()
}
func setCoordinates(coordinate: Coordinate) {
set(coordinate.latitude, forKey: UserDefaultsKeys.latitude.rawValue)
set(coordinate.longitude, forKey: UserDefaultsKeys.longitude.rawValue)
synchronize()
}
func isOwner() -> Bool {
return bool(forKey: UserDefaultsKeys.isOwner.rawValue)
}
func isLoggedIn() -> Bool {
return bool(forKey: UserDefaultsKeys.isLoggedIn.rawValue)
}
func coordinates() -> (latitude: Double, longitude: Double)? {
if let latitude = string(forKey: UserDefaultsKeys.latitude.rawValue),
let longitude = string(forKey: UserDefaultsKeys.longitude.rawValue) {
return (latitude: Double(latitude)!, longitude: Double(longitude)!)
} else {
return nil
}
}
}
所以要设置 isLoggedIn
状态或 isOwner
状态:
UserDefaults.standard.setIsLoggedIn(value: true)
UserDefaults.standard.setIsOwner(value: isOwner) // isOwner is a boolean value
仅当用户创建帐户或用户登录时,才会在两个位置调用此设置 .
然后,当用户注销时,我只在一个地方删除UserDefaults:
for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
if key != UserDefaults.UserDefaultsKeys.latitude.rawValue &&
key != UserDefaults.UserDefaultsKeys.longitude.rawValue {
UserDefaults.standard.removeObject(forKey: key)
}
}
我可以登录并将两个值打印到控制台 . 如果我在5秒或5分钟内强制崩溃应用程序,则其中一个设置为dissapear的UserDefaults值
extension UIViewController
{
func isOwner() -> Bool {
return UserDefaults.standard.isOwner()
}
func isLoggedIn() -> Bool {
return UserDefaults.standard.isLoggedIn()
}
}
.
class ViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
if isOwner() {
sectionOne = ["Account details", "Profile"]
sectionTwo = ["Posts you've liked", "Messages"]
sectionFour = "Log out"
} else if isLoggedIn() {
sectionOne = ["Account details"]
sectionTwo = ["Posts you've liked"]
sectionFour = "Log out"
} else {
sectionOne.removeAll()
sectionTwo.removeAll()
sectionFour = "Log in"
}
}
tableView.reloadData()
}
使用 UITabBarController
来思考Instagram . 上面的代码将存在于最后一个选项卡 Accounts
选项卡中 . 当视图出现时,它将根据需要重新传输tableView .