我可以在应用程序终止后从 NSUserDefaults 检索数据吗?
Can I retrieve data from NSUserDefaults after app termination?
我想知道 NSUserDefaults 将所有存储的数据写入何处:应用程序内存或应用程序所在的设备 运行?在后一种情况下,我想即使应用程序已完全关闭,我也应该能够从 NSUserDefaults 检索存储的数据,对吗?基本上我想做的是:在运行时我想检查用户是否在 he/she 关闭应用程序时登录(我在用户登录时将其作为布尔值存储在 NSUserDefaults 中或注销),如果用户已登录,我想设置一个与原始根视图控制器不同的根视图控制器,用户将看到该应用程序是否是第一次打开。我尝试了很多不同的方法,但在我的设备上测试时似乎没有任何效果。 NSUserDefaults 是执行此操作的最佳方法吗(如果是,那么如何?)还是有更好的替代方法来执行此操作?
你有几个问题。根据 Whosebug 上的其他答案,NSUserDefaults
在应用程序启动期间持续存在:Data persistence through NSUserDefaults。但是,一旦删除该应用程序,您将丢失数据。
就根视图控制器的编程而言,我会说是的,如果您想显示登录根视图控制器,那么在 NSUserDefaults
中存储登录持久性是一个非常好的案例。当然,不要将他们的登录名直接存储在默认值中:)
我要注意的一件事是,很快就很难推断出视图层次结构,如果根视图控制器发生变化,您可能会引入非常讨厌的错误。例如,一旦用户登录,您将如何处理旧的根视图控制器?而不是你所描述的,我会保留相同的根视图控制器,但如果需要登录,则在根顶部显示一个登录模式。逻辑更简单,应用更稳定。
当使用 'NSUserDefaults' 来处理像这样简单的事情时,它将很好地实现您想要实现的目标。
这是您将放置在 AppDelegate 中的代码,它将处理根据值将用户发送到正确的视图。
Swift 2
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let logonStatus = NSUserDefaults.boolForKey("LogonStatus")
if logonStatus {
print("User logged in.")
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewControllerWithIdentifier("navController") as! UINavigationController
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
} else {
print("User not Logged in.")
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewControllerWithIdentifier("loginViewController") as UIViewController
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
}
return true
}
然后在您的注销或登录 viewController 或执行注销或登录的代码中,您只需要确保设置 'NSUsersDefaults' 值。
NSUserDefaults.setBool(true, forKey: "logonStatus") // Logged On
NSUserDefaults.setBool(false, forKey: "logonStatus") // Logged Off
Swift 3
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let logonStatus = UserDefaults.standard.bool(forKey: "LogonStatus")
if logonStatus {
print("User logged in.")
self.window = UIWindow(frame: UIScreen.main.bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "navController") as! UINavigationController
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
} else {
print("User not Logged in.")
self.window = UIWindow(frame: UIScreen.main.bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "loginViewController") as UIViewController
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
}
return true
}
设置'UserDefaults'
UserDefaults.standard.set(true, forKey: "LogonStatus")
我想知道 NSUserDefaults 将所有存储的数据写入何处:应用程序内存或应用程序所在的设备 运行?在后一种情况下,我想即使应用程序已完全关闭,我也应该能够从 NSUserDefaults 检索存储的数据,对吗?基本上我想做的是:在运行时我想检查用户是否在 he/she 关闭应用程序时登录(我在用户登录时将其作为布尔值存储在 NSUserDefaults 中或注销),如果用户已登录,我想设置一个与原始根视图控制器不同的根视图控制器,用户将看到该应用程序是否是第一次打开。我尝试了很多不同的方法,但在我的设备上测试时似乎没有任何效果。 NSUserDefaults 是执行此操作的最佳方法吗(如果是,那么如何?)还是有更好的替代方法来执行此操作?
你有几个问题。根据 Whosebug 上的其他答案,NSUserDefaults
在应用程序启动期间持续存在:Data persistence through NSUserDefaults。但是,一旦删除该应用程序,您将丢失数据。
就根视图控制器的编程而言,我会说是的,如果您想显示登录根视图控制器,那么在 NSUserDefaults
中存储登录持久性是一个非常好的案例。当然,不要将他们的登录名直接存储在默认值中:)
我要注意的一件事是,很快就很难推断出视图层次结构,如果根视图控制器发生变化,您可能会引入非常讨厌的错误。例如,一旦用户登录,您将如何处理旧的根视图控制器?而不是你所描述的,我会保留相同的根视图控制器,但如果需要登录,则在根顶部显示一个登录模式。逻辑更简单,应用更稳定。
当使用 'NSUserDefaults' 来处理像这样简单的事情时,它将很好地实现您想要实现的目标。
这是您将放置在 AppDelegate 中的代码,它将处理根据值将用户发送到正确的视图。
Swift 2
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let logonStatus = NSUserDefaults.boolForKey("LogonStatus")
if logonStatus {
print("User logged in.")
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewControllerWithIdentifier("navController") as! UINavigationController
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
} else {
print("User not Logged in.")
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewControllerWithIdentifier("loginViewController") as UIViewController
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
}
return true
}
然后在您的注销或登录 viewController 或执行注销或登录的代码中,您只需要确保设置 'NSUsersDefaults' 值。
NSUserDefaults.setBool(true, forKey: "logonStatus") // Logged On
NSUserDefaults.setBool(false, forKey: "logonStatus") // Logged Off
Swift 3
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let logonStatus = UserDefaults.standard.bool(forKey: "LogonStatus")
if logonStatus {
print("User logged in.")
self.window = UIWindow(frame: UIScreen.main.bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "navController") as! UINavigationController
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
} else {
print("User not Logged in.")
self.window = UIWindow(frame: UIScreen.main.bounds)
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "loginViewController") as UIViewController
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
}
return true
}
设置'UserDefaults'
UserDefaults.standard.set(true, forKey: "LogonStatus")