0

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

4

2 回答 2

1

你在这里有几个问题。NSUserDefaults根据 StackOverflow 上的其他答案:通过 NSUserDefaults 的数据持久性,在应用程序启动期间是持久的。但是,一旦您删除该应用程序,您将丢失数据。

就根视图控制器的编程而言,我会说是的,如果您想显示登录根视图控制器,那么将登录持久性存储在NSUserDefaults. 只是不要将他们的登录名直接存储在默认值中:)

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

于 2016-10-14T16:28:00.597 回答
1

当将“NSUserDefaults”用于像这样简单的事情时,它会很好地满足您想要实现的目标。

这是您将放置在 AppDelegate 中的代码,它将根据该值将用户发送到正确的视图。

斯威夫特 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
}

然后在您的注销或登录视图控制器或执行注销或登录的代码中,您只需要确保设置“NSUsersDefaults”值。

NSUserDefaults.setBool(true, forKey: "logonStatus") // Logged On
NSUserDefaults.setBool(false, forKey: "logonStatus") // Logged Off

斯威夫特 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.standard.set(true, forKey: "LogonStatus")
于 2016-10-14T16:49:15.400 回答