Ios 未成功检测到第一个应用程序启动,我应该怎么做?

Ios 未成功检测到第一个应用程序启动,我应该怎么做?,ios,swift,launch-screen,Ios,Swift,Launch Screen,我有一个应用程序和一个演练屏幕,如果用户第一次打开应用程序,我想显示演练屏幕,但我做错了。我应该把代码放在AppDelegate中还是放在我第一个屏幕的ViewDidLoad中。 以下是我使用的代码: super.viewDidLoad() if UserDefaults.standard.bool(forKey: "isFirstLaunch") { UserDefaults.standard.set(true, forKey: "isFirstLaunch")

我有一个应用程序和一个演练屏幕,如果用户第一次打开应用程序,我想显示演练屏幕,但我做错了。我应该把代码放在AppDelegate中还是放在我第一个屏幕的ViewDidLoad中。 以下是我使用的代码:

  super.viewDidLoad()

    if UserDefaults.standard.bool(forKey: "isFirstLaunch") {

        UserDefaults.standard.set(true, forKey: "isFirstLaunch")
        UserDefaults.standard.synchronize()
    }
    let isFirstLaunch = UserDefaults.standard.value(forKey: "isFirstLaunch") as? Bool
    if isFirstLaunch! {

            let mainStoryboard = UIStoryboard(name: "ViewController", bundle: Bundle.main)
            let vc : ViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
            self.present(vc, animated: true, completion: nil)


    }
以及错误的图片:


任何IDE如何操作?

您的错误与展开可选值有关。您应该做的是检查用户默认值中是否有值

if let isFirstLaunch = UserDefaults.standard.bool(forKey: "isFirstLaunch") {
    //execute code for when it isn't the first launch
} else {
    //set value of isFirstLaunch for the first time
}

如果isFirstLaunch为零,则意味着这是第一次启动。

您有许多问题:

  • 你不必要地把钥匙设为true,她已经是true了
  • 您不必要地调用
    synchronize
  • 您使用的是
    value(forKey:)
    而不是
    bool(forKey:)
  • (这就是你崩溃的原因)你没有打开你得到的值,这意味着你的应用程序在值为零时崩溃
  • 您所需要的就是这样的东西:

    let defaults = UserDefaults()
    if !defaults.bool(forKey:"walkthroughShown") {
       defaults.set(true, forKey:"walkthroughShown")
       // Display your Walkthrough
    }
    
    viewDidLoad
    不会用作此代码的位置,您最好在应用程序代理中使用此代码来演示演练或初始视图控制器

    (Apple)建议的方法是注册默认值(如类用户默认值所示)

    尽快–例如在
    应用程序willfinishLaunching
    中–插入

    let defaultValues = ["isFirstLaunch" : true]
    UserDefaults.standard.register(defaults: defaultValues)
    
    最早的时刻是应用程序委托中的
    init
    方法

    override init()
    {
        let defaultValues = ["isFirstLaunch" : true]
        UserDefaults.standard.register(defaults: defaultValues)
        super.init()
    }
    
    然后简单地写

    func viewDidLoad()
        super.viewDidLoad()
        let defaults = UserDefaults.standard
        if defaults.bool(forKey: "isFirstLaunch") {
            defaults.set(false, forKey: "isFirstLaunch")
            let mainStoryboard = UIStoryboard(name: "ViewController", bundle: Bundle.main)
            let vc : ViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
            self.present(vc, animated: true, completion: nil)
        }
    }
    

    默认值会一直被考虑,直到第一次更改为止。

    您应该首先打开该值:

    if let isFirstStart = UserDefaults.standard.value(forKey: "isFirstLaunch") as? Bool {
       // the isFirstStart value exists, you can check the value
    } else {
       // the isFirstStart value does not exist
    }
    
    我认为isFirstStart是一个糟糕的措辞约定,因为它不可能在第一时间成为真的(因为它以前没有被设置过)。您应该使用例如hasStarted,它指示如果该值不存在,则该值以前未启动过,如果存在且为true,则该值已启动


    希望这有帮助,请随意提问。

    我是否应该在app delegate中写入let defaultValues=[“isFirstLaunch”:true]UserDefaults.standard.注册(默认值:defaultValues),然后在viewdiload或一个viewcontrollerYes、AppDelegate中的所有内容,在任何情况下,您都必须确保在视图控制器中的
    viewDidLoad
    方法之前执行要注册默认值的行。当我第一次启动应用程序时,我会发出错误信号SIGBART。我将其放置在应用程序WillFinishLaunching中,但它现在仍在工作。有什么想法吗?:(我更新了答案,建议将代码放在AppDelegate的
    init
    方法中。如果错误仍然发生,则与用户默认值无关。同样的错误。我可以将代码发送给您看看,因为您更专业
    UserDefaults bool(forKey:)
    不返回可选代码。此代码无法编译。谢谢,显示演练的代码应该是什么?我在GitHub上有一个类似的代码。下面是链接:我希望它能满足您的需要。如果有人需要,还可以提供此参考教程: