应用程序终止后,我可以从NSUserDefaults检索数据吗?

时间:2016-10-14 16:24:20

标签: ios swift xcode nsuserdefaults rootviewcontroller

我想知道NSUserDefaults将所有存储的数据写入:app应用程序内存或应用程序运行的设备?在后一种情况下,我想我应该能够从NSUserDefaults检索存储的数据,即使应用程序已经完全关闭,对吧?基本上我正在尝试做的事情:在运行时我想检查用户是否在他/她关闭应用程序时登录(我在用户登录时将其作为布尔值存储在NSUserDefaults中或注销),如果用户已登录,我想从原始根视图控制器设置一个不同的根视图控制器,如果该应用程序是第一次打开,用户将看到该控制器。我尝试了很多不同的东西,但是当我在我的设备上测试它时似乎没有任何效果。 NSUserDefaults是这样做的最佳方法(如果是,那么如何?)或者有更好的替代方法吗?

2 个答案:

答案 0 :(得分:1)

你在这里有几个问题。根据StackOverflow上的另一个答案,NSUserDefaults在应用启动期间保持不变:Data persistence through NSUserDefaults。但是,删除应用后,您将丢失数据。

在根视图控制器的编程方面,我会说是的,如果你想显示登录根视图控制器,这是在NSUserDefaults中存储登录持久性的一个非常有力的案例。只是不要将他们的登录名直接存储在默认值中:)

我要注意的一件事是,很快就会很难推断视图层次结构,如果根视图控制器正在发生变化,你可以引入非常讨厌的错误。比如,一旦用户登录,您如何处理旧的根视图控制器?而不是你描述的内容,我会保留相同的根视图控制器,但如果需要登录,则提供一个用于登录根模式的模式。更简单的逻辑和您的应用程序将更稳定。

答案 1 :(得分:1)

使用' 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")