无法使用 UserDefaults (Swift) 仅显示一次欢迎 ViewController

Cannot get a welcome ViewController to show only once with UserDefaults (Swift)

我正在尝试检测这是否是用户的首次访问,如果是,则显示欢迎屏幕,但我似乎无法正常工作,而且我不确定自己做错了什么。我查看了此处的一些建议并遵循了它们,我认为我理解了这个概念,但我无法让它发挥作用。

即使我尝试清除模拟器中的所有内容和设置,我还是被直接发送到 ViewController。

知道我做错了什么吗?任何提示将不胜感激。

代码如下:

func didFinishLaunchingWithOptions 下的 AppDelegate

    self.window = UIWindow(frame: UIScreen.main.bounds)

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    var vc: UIViewController?
    var ud = UserDefaults.standard.bool(forKey: "UDisFirstVisit")

    if ud == true {
        print("This is the user's first visit")
        vc = storyboard.instantiateViewController(withIdentifier: "Welcome_01")
    } else if ud == false {
        print ("This is NOT the user's first visit")
        vc = storyboard.instantiateInitialViewController()!
    }


    self.window?.rootViewController = vc
    self.window?.makeKeyAndVisible()

    return true

Welcome_01(欢迎VC)

import UIKit

var isFirstVisit = true

class Welcome_01: UIViewController {

    @IBAction func finishedwelcome(_ sender: Any) {
        isFirstVisit = false
        UserDefaults.standard.set(isFirstVisit, forKey: "UDisFirstVisit")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
    }

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

UIViewController(VC 应该在第一次访问后显示)。

class ViewController: UIViewController {

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

}

首次安装应用时,您的任何 UserDefaults 键都没有值。所以当你这样做时:

var ud = UserDefaults.standard.bool(forKey: "UDisFirstVisit")

在不存在的 UDisFirstVisit 键上,您将返回 false

来自 bool(forKey:) 的文档:

The Boolean value associated with the specified key. If the specified key doesn‘t exist, this method returns false.

你有两个选择。

  1. 颠倒你的逻辑。首次显示欢迎屏幕后,将 UDhasVisited 键设置为 true。启动时,如果是 false,显示欢迎屏幕。
  2. 将以下行添加到您的 didFinishLaunchingWithOptions:

    UserDefaults.standard.register(defaults: [ "UDisFirstVisit": true ])
    

两者选其一(不是两者)。

只需在您的想象中追踪动作即可。用户第一次运行该应用程序时会发生什么?

var ud = UserDefaults.standard.bool(forKey: "UDisFirstVisit")

好吧,用户默认设置中从未有过任何条目。所以 ud 不是 true,因为它不是 任何东西 — 它不存在!所以是false。所以你的欢迎视图控制器永远不会出现。

把你的逻辑反过来就行了。首先询问键 "UserHasSeenWelcome" 是否为 false。如果是,显示欢迎 v.c。并将密钥设置为 true.