代码之家  ›  专栏  ›  技术社区  ›  CristianMoisei

无法使用userdefaults(swift)使欢迎viewcontroller只显示一次

  •  0
  • CristianMoisei  · 技术社区  · 7 年前

    我试图检测这是否是用户第一次访问,如果是这样的话,我会显示欢迎屏幕,但我似乎无法让它工作,我不确定我做错了什么。我看了这里的一些建议,并遵循了它们,我认为我理解这个概念,但我不能让这个工作。

    我被直接发送到viewcontroller,即使我试图删除模拟器中的所有内容和设置。

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

    代码如下:

    func didffinishlaunchingwithoptions下的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
    

    欢迎光临 (欢迎风投)

    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()
        }
    

    uiview控制器 (风投应该在第一次访问后才出现)。

    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
    }
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   matt    7 年前

    只要在你的想象中找到行动。用户第一次运行应用程序时会发生什么情况?

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

    好吧,用户默认值从来没有输入过。所以 ud 不是 true ,因为它不是 任何东西 它不存在!原来是这样 false . 因此,您的欢迎视图控制器从未出现过。

    把你的逻辑颠倒过来。从询问钥匙开始 "UserHasSeenWelcome" . 如果是,请显示欢迎v.c.并将键设置为

        2
  •  0
  •   rmaddy    7 年前

    首次安装应用程序时,没有任何用户默认密钥的值。所以当你这么做的时候:

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

    论不存在 UDisFirstVisit 钥匙,你会回来的 false

    从文件中 bool(forKey:) :

    与指定键关联的布尔值。如果指定的键不存在,则此方法返回false。

    你有两个选择。

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

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

    从两个中选一个(不是两个都选)。