【问题标题】:Can I retrieve data from NSUserDefaults after app termination?应用程序终止后,我可以从 NSUserDefaults 检索数据吗?
【发布时间】:2016-10-14 16:24:20
【问题描述】:

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

【问题讨论】:

    标签: ios swift xcode nsuserdefaults rootviewcontroller


    【解决方案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")
    

    【讨论】:

    • 这几乎和我试过的一样。每当发生登录或注销时,我都会存储userDefaults.set(self.userIsLoggedIn == true, for: "userLoginStatus"),并且设置根视图控制器也几乎相同,只是我将视图控制器设置为根后忘记调用makeKeyAndVisible()方法。
    【解决方案2】:

    您有几个问题。 NSUserDefaults 在应用程序启动期间始终存在,根据 StackOverflow 上的其他答案:Data persistence through NSUserDefaults。但是,一旦您删除该应用程序,您将丢失数据。

    就根视图控制器的编程而言,我会说是的,如果您想显示登录根视图控制器,那么将登录持久性存储在NSUserDefaults 中是一个非常有力的案例。当然,不要将他们的登录信息直接存储在默认值中:)

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

    【讨论】:

      猜你喜欢
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 2015-06-24
      • 2017-12-29
      • 2013-10-01
      • 2020-12-30
      • 1970-01-01
      相关资源
      最近更新 更多