无法获得欢迎的ViewController只能使用UserDefaults(Swift)显示一次

时间:2018-06-03 15:04:14

标签: swift uiviewcontroller nsuserdefaults userdefaults

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

即使我尝试删除模拟器中的所有内容和设置,我也会直接发送到ViewController。

任何想法我做错了什么?任何提示将不胜感激。

以下是代码:

func下的AppDelegate didFinishLaunchingWithOptions

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

}

2 个答案:

答案 0 :(得分:0)

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

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

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

来自bool(forKey:)的文档:

  

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

您有两种选择。

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

    UserDefaults.standard.register(defaults: [ "UDisFirstVisit": true ])
    
  3. 选择其中一个(不是两个)。

答案 1 :(得分:0)

只需追溯你想象中的动作。用户第一次运行应用程序时会发生什么?

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

嗯,用户默认值没有进入任何条目。因此ud不是true,因为它不是任何 - 它不存在!所以它是false。因此,您的欢迎视图控制器永远不会被看到。

改变你的逻辑。首先询问密钥"UserHasSeenWelcome"是否 false 。如果是,请显示欢迎v.c.并将密钥设置为true