Ios 未成功检测到第一个应用程序启动,我应该怎么做?
我有一个应用程序和一个演练屏幕,如果用户第一次打开应用程序,我想显示演练屏幕,但我做错了。我应该把代码放在AppDelegate中还是放在我第一个屏幕的ViewDidLoad中。 以下是我使用的代码: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")
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为零,则意味着这是第一次启动。您有许多问题:
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上有一个类似的代码。下面是链接:我希望它能满足您的需要。如果有人需要,还可以提供此参考教程: