Swift - 如果尚未设置,请设置 UserDefault

Swift - Set UserDefault if not already set

我的意图是每个用户只显示一次我的 InitialViewController

didFinishLaunchingWithOptions 中的代码应该在开始时检查 UserDefaults 键 firstTime 的值是否仍然为真。
如果没有,则不显示InitialViewController。如果它是 true 并且 VC 正在显示,它的按钮(见下面的第二个代码)应将 firstTime 设置为 false 以防止 InitialViewController 在应用程序下次启动时显示。

我想我已经解决了问题,即:didFinishLaunchingWithOptions 内部的 defaults.set(true, forKey: "firstTime")
每次应用程序启动时,它都会忽略密钥可能已设置为false 在之前的开始中,因为无论如何它都将其设置为 true 。
一个可能的解决方案可能是检查 firstTime 是否已经设置,如果是,则不会再次设置 firstTime但我还没有找到可行的方法。这就是我需要你帮助的地方.
删除它也无济于事,因为当应用程序第一次启动时,它需要存在并成为 true首先显示 InitialViewController

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        if let rvc = self.window?.rootViewController {

            let defaults = UserDefaults.standard
            defaults.set(true, forKey: "firstTime")

            if defaults.bool(forKey: "firstTime") == true  {
                let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
                self.window!.rootViewController = vc
            }
        }
        return true
    }
@IBAction func buttonStart(_ sender: UIButton) {
        if (nameInput.text != "" && startKmInput.text != "") {

            let defaults = UserDefaults.standard
            defaults.set(false, forKey: "firstTime")

            performSegue(withIdentifier: "goToSecond", sender: self)
        }
    }

好吧,您可以反转您的逻辑并检查初始操作是否发生,因此您无需在应用启动时设置值。例如:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        if let rvc = self.window?.rootViewController {

            let defaults = UserDefaults.standard

            if !defaults.bool(forKey: "buttonStartPressed")  {
                let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
                self.window!.rootViewController = vc
            }
        }
        return true
    }

然后:

@IBAction func buttonStart(_ sender: UIButton) {
        if (nameInput.text != "" && startKmInput.text != "") {

            let defaults = UserDefaults.standard
            defaults.set(true, forKey: "buttonStartPressed")

            performSegue(withIdentifier: "goToSecond", sender: self)
        }
}

您发布的代码

        let defaults = UserDefaults.standard
        defaults.set(true, forKey: "firstTime")

        if defaults.bool(forKey: "firstTime") == true  {
            let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
            self.window!.rootViewController = vc
        }

总是首先将 true 写入键 "firstTime",然后读取该键并发现它为 true。

不要那样做。相反,反转你的逻辑并使用 "notFirstTime" 标志:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    if let rvc = self.window?.rootViewController {

        let defaults = UserDefaults.standard
        let notFirstTime = defaults.bool(forKey: "notFirstTime") //will be false the first time
        defaults.set(true, forKey: "notFirstTime")

        if notFirstTime == false  {
            let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
            self.window!.rootViewController = vc
        }
    }
    return true
}