Swift - 如果尚未设置,请设置 UserDefault
Swift - Set UserDefault if not already set
我的意图是每个用户只显示一次我的 InitialViewController
。
didFinishLaunchingWithOptions
中的代码应该在开始时检查 UserDefaults 键 firstTime
的值是否仍然为真。
如果没有,则不显示InitialViewController
。如果它是 true 并且 VC 正在显示,它的按钮(见下面的第二个代码)应将 firstTime
设置为 false 以防止 InitialViewController
在应用程序下次启动时显示。
我想我已经解决了问题,即:didFinishLaunchingWithOptions
内部的 defaults.set(true, forKey: "firstTime")
:
每次应用程序启动时,它都会忽略密钥可能已设置为false
在之前的开始中,因为无论如何它都将其设置为 true 。
一个可能的解决方案可能是检查 firstTime
是否已经设置,如果是,则不会再次设置 firstTime
。 但我还没有找到可行的方法。这就是我需要你帮助的地方.
删除它也无济于事,因为当应用程序第一次启动时,它需要存在并成为 true
首先显示 InitialViewController
。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let rvc = self.window?.rootViewController {
let defaults = UserDefaults.standard
defaults.set(true, forKey: "firstTime")
if defaults.bool(forKey: "firstTime") == true {
let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
self.window!.rootViewController = vc
}
}
return true
}
@IBAction func buttonStart(_ sender: UIButton) {
if (nameInput.text != "" && startKmInput.text != "") {
let defaults = UserDefaults.standard
defaults.set(false, forKey: "firstTime")
performSegue(withIdentifier: "goToSecond", sender: self)
}
}
好吧,您可以反转您的逻辑并检查初始操作是否发生,因此您无需在应用启动时设置值。例如:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let rvc = self.window?.rootViewController {
let defaults = UserDefaults.standard
if !defaults.bool(forKey: "buttonStartPressed") {
let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
self.window!.rootViewController = vc
}
}
return true
}
然后:
@IBAction func buttonStart(_ sender: UIButton) {
if (nameInput.text != "" && startKmInput.text != "") {
let defaults = UserDefaults.standard
defaults.set(true, forKey: "buttonStartPressed")
performSegue(withIdentifier: "goToSecond", sender: self)
}
}
您发布的代码
let defaults = UserDefaults.standard
defaults.set(true, forKey: "firstTime")
if defaults.bool(forKey: "firstTime") == true {
let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
self.window!.rootViewController = vc
}
总是首先将 true 写入键 "firstTime",然后读取该键并发现它为 true。
不要那样做。相反,反转你的逻辑并使用 "notFirstTime" 标志:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let rvc = self.window?.rootViewController {
let defaults = UserDefaults.standard
let notFirstTime = defaults.bool(forKey: "notFirstTime") //will be false the first time
defaults.set(true, forKey: "notFirstTime")
if notFirstTime == false {
let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
self.window!.rootViewController = vc
}
}
return true
}
我的意图是每个用户只显示一次我的 InitialViewController
。
didFinishLaunchingWithOptions
中的代码应该在开始时检查 UserDefaults 键 firstTime
的值是否仍然为真。
如果没有,则不显示InitialViewController
。如果它是 true 并且 VC 正在显示,它的按钮(见下面的第二个代码)应将 firstTime
设置为 false 以防止 InitialViewController
在应用程序下次启动时显示。
我想我已经解决了问题,即:didFinishLaunchingWithOptions
内部的 defaults.set(true, forKey: "firstTime")
:
每次应用程序启动时,它都会忽略密钥可能已设置为false
在之前的开始中,因为无论如何它都将其设置为 true 。
一个可能的解决方案可能是检查 firstTime
是否已经设置,如果是,则不会再次设置 firstTime
。 但我还没有找到可行的方法。这就是我需要你帮助的地方.
删除它也无济于事,因为当应用程序第一次启动时,它需要存在并成为 true
首先显示 InitialViewController
。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let rvc = self.window?.rootViewController {
let defaults = UserDefaults.standard
defaults.set(true, forKey: "firstTime")
if defaults.bool(forKey: "firstTime") == true {
let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
self.window!.rootViewController = vc
}
}
return true
}
@IBAction func buttonStart(_ sender: UIButton) {
if (nameInput.text != "" && startKmInput.text != "") {
let defaults = UserDefaults.standard
defaults.set(false, forKey: "firstTime")
performSegue(withIdentifier: "goToSecond", sender: self)
}
}
好吧,您可以反转您的逻辑并检查初始操作是否发生,因此您无需在应用启动时设置值。例如:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let rvc = self.window?.rootViewController {
let defaults = UserDefaults.standard
if !defaults.bool(forKey: "buttonStartPressed") {
let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
self.window!.rootViewController = vc
}
}
return true
}
然后:
@IBAction func buttonStart(_ sender: UIButton) {
if (nameInput.text != "" && startKmInput.text != "") {
let defaults = UserDefaults.standard
defaults.set(true, forKey: "buttonStartPressed")
performSegue(withIdentifier: "goToSecond", sender: self)
}
}
您发布的代码
let defaults = UserDefaults.standard
defaults.set(true, forKey: "firstTime")
if defaults.bool(forKey: "firstTime") == true {
let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
self.window!.rootViewController = vc
}
总是首先将 true 写入键 "firstTime",然后读取该键并发现它为 true。
不要那样做。相反,反转你的逻辑并使用 "notFirstTime" 标志:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let rvc = self.window?.rootViewController {
let defaults = UserDefaults.standard
let notFirstTime = defaults.bool(forKey: "notFirstTime") //will be false the first time
defaults.set(true, forKey: "notFirstTime")
if notFirstTime == false {
let vc = rvc.storyboard!.instantiateViewController(withIdentifier: "InitialViewController")
self.window!.rootViewController = vc
}
}
return true
}