我想知道NSUserDefaults将所有存储的数据写入:app应用程序内存或应用程序运行的设备?在后一种情况下,我想我应该能够从NSUserDefaults检索存储的数据,即使应用程序已经完全关闭,对吧?基本上我正在尝试做的事情:在运行时我想检查用户是否在他/她关闭应用程序时登录(我在用户登录时将其作为布尔值存储在NSUserDefaults中或注销),如果用户已登录,我想从原始根视图控制器设置一个不同的根视图控制器,如果该应用程序是第一次打开,用户将看到该控制器。我尝试了很多不同的东西,但是当我在我的设备上测试它时似乎没有任何效果。 NSUserDefaults是这样做的最佳方法(如果是,那么如何?)或者有更好的替代方法吗?
答案 0 :(得分:1)
你在这里有几个问题。根据StackOverflow上的另一个答案,NSUserDefaults
在应用启动期间保持不变:Data persistence through NSUserDefaults。但是,删除应用后,您将丢失数据。
在根视图控制器的编程方面,我会说是的,如果你想显示登录根视图控制器,这是在NSUserDefaults
中存储登录持久性的一个非常有力的案例。只是不要将他们的登录名直接存储在默认值中:)
我要注意的一件事是,很快就会很难推断视图层次结构,如果根视图控制器正在发生变化,你可以引入非常讨厌的错误。比如,一旦用户登录,您如何处理旧的根视图控制器?而不是你描述的内容,我会保留相同的根视图控制器,但如果需要登录,则提供一个用于登录根模式的模式。更简单的逻辑和您的应用程序将更稳定。
答案 1 :(得分:1)
使用' NSUserDefaults'对于像这样简单的东西,它可以很好地满足你想要实现的目标。
这是您在AppDelegate中放置的代码,用于根据值将用户发送到正确的视图。
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
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")