不确定这是一个错误还是什么。我有两个不同的值,我想在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。