【问题标题】:Swift UserDefaults not persisting after relaunching app重新启动应用程序后,Swift UserDefaults 不会持续存在
【发布时间】:2022-06-10 18:05:45
【问题描述】:

我的用户默认设置在我的应用程序启动时没有持续存在的问题。我已经阅读了有关此问题的其他帖子,并且大多数都在各种提示后标记为已解决。我已经实施了所有建议的技巧(我知道),但我仍然遇到这个问题。

我创建了最简单的示例应用程序。该应用程序有一个按钮,可以根据名为“isLoggedIn”的 UserDefault 设置的当前状态在登录/注销之间切换。

这是代码...

import UIKit

class LoginViewController: UIViewController {

    @IBOutlet weak var loginButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()        
    }

    override func viewDidAppear(_ animated: Bool) {
        refreshButton()
    }

    @IBAction func loginButtonPressed(_ sender: UIButton) {
        let isLoggedIn = UserDefaults.standard.bool(forKey: "isLoggedIn")
    
        UserDefaults.standard.set(!isLoggedIn, forKey: "isLoggedIn")
    
        refreshButton()
    }

    func refreshButton() {
        let isLoggedIn = UserDefaults.standard.bool(forKey: "isLoggedIn")
            
        loginButton.setTitle(isLoggedIn ? "Logout" : "Login", for: .normal)
    }

}

单击按钮时,会更新 UserDefault 设置并刷新按钮以根据新设置显示登录或注销。如果我在模拟器中运行应用程序,我可以看到按钮切换,它告诉我 UserDefault 设置已正确存储。

当我重新启动应用程序时出现问题。当应用程序关闭时,该按钮会刷新以显示 UserDefault 设置的最后状态。但它并不总是正确地反映以前的状态。偶尔会,但我更多时候不会。我在这里也看不到任何模式。

我试过了……

  • 使用set 方法代替setValue 方法
  • 应用更新后调用 synchronize 方法(我知道 Apple 表示不再需要或建议这样做)

我只是无法确定我忽略了什么。有人对我做错了什么有任何想法吗?如果我可以提供任何可能有帮助的其他代码,请告诉我。

谢谢, 乔尔

更新

我决定跟踪 plist 文件本身中设置的实际更改。经过检查,我注意到该设置需要几秒钟才能在文件中进行物理更新。因此,如果我在关闭我的应用程序之前等待几秒钟,那么设置将保存并且当我再次启动时它会正确显示。所以新的问题是......

  • 为什么我的设置需要这么长时间才能保存?
  • 在正确保存设置之前,我能否确保应用不会关闭?

这很有趣,因为我认为这是 Apple 说不再使​​用的 synchronize 方法的目的。

再次感谢!

【问题讨论】:

    标签: ios swift nsuserdefaults userdefaults


    【解决方案1】:
    import UIKit
    
    class LoginViewController: UIViewController {
        var isLogin = false
        @IBOutlet weak var loginButton: UIButton!
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            refreshButton()
        }
    
    
        @IBAction func loginButtonPressed(_ sender: UIButton) {
            isLogin.toggle()
            UserDefaults.standard.set(isLogin, forKey: "isLoggedIn")
            refreshButton()
        }
    
        func refreshButton() {
            isLogin = UserDefaults.standard.bool(forKey: "isLoggedIn")
                
            loginButton.setTitle(isLogin ? "Logout" : "Login", for: .normal)
        }
    
    }
    

    【讨论】:

    • 谢谢泽山。我怀疑您的解决方案是否可行,因为您真正要做的只是将切换存储在局部变量中。我用你的代码试过了,还是不行。还有其他建议吗?我注意到在ViewWillAppear 函数中添加了super.viewWillAppear。这让我想知道我是否遗漏了什么,并且我的设置在启动时没有正确加载。你知道是否有办法检查存储在设置文件中的值吗?
    • 它工作正常,兄弟我已经测试过很多次了
    • 我昨天更新了我的帖子。它不起作用的原因是因为我的设置没有足够快地写入 plist 文件。很多时候,我在保存值之前关闭了应用程序。这就是我重新启动应用程序时它不匹配的原因。所以根本问题从来不是真正的设置没有保存。我以为当我在实际设备上运行时问题就消失了,但我错了。当我在平板电脑或手机上运行时,我仍然遇到问题。我认为已弃用的 synchronize 方法旨在等待设置完成更新后再恢复,但它们没有。谢谢。
    【解决方案2】:

    您的问题有一个解释,这是因为 UserDefault 系统的工作方式。通常,保存数据需要时间。 您可能会在应用程序开发过程中丢失数据。 例如,如果您正在使用 swift 开发应用程序,当您更改项目中的一些代码并启动您的应用程序然后单击停止按钮时,您可能会丢失一些数据,因为此时,一些数据仍在等待保存的内存。

    不过不用担心,当您的应用程序发布给用户时,它最终会被保存。

    在这里,希望这篇文章能解决你的困惑:Why Do You Lose Data Stored in User Defaults

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 2014-09-14
      • 2020-05-10
      相关资源
      最近更新 更多