无法使用 UserDefaults (Swift) 仅显示一次欢迎 ViewController
Cannot get a welcome ViewController to show only once with UserDefaults (Swift)
我正在尝试检测这是否是用户的首次访问,如果是,则显示欢迎屏幕,但我似乎无法正常工作,而且我不确定自己做错了什么。我查看了此处的一些建议并遵循了它们,我认为我理解了这个概念,但我无法让它发挥作用。
即使我尝试清除模拟器中的所有内容和设置,我还是被直接发送到 ViewController。
知道我做错了什么吗?任何提示将不胜感激。
代码如下:
func didFinishLaunchingWithOptions 下的 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
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()
}
}
首次安装应用时,您的任何 UserDefaults 键都没有值。所以当你这样做时:
var ud = UserDefaults.standard.bool(forKey: "UDisFirstVisit")
在不存在的 UDisFirstVisit
键上,您将返回 false
。
来自 bool(forKey:)
的文档:
The Boolean value associated with the specified key. If the specified key doesn‘t exist, this method returns false.
你有两个选择。
- 颠倒你的逻辑。首次显示欢迎屏幕后,将
UDhasVisited
键设置为 true
。启动时,如果是 false
,显示欢迎屏幕。
将以下行添加到您的 didFinishLaunchingWithOptions
:
UserDefaults.standard.register(defaults: [ "UDisFirstVisit": true ])
两者选其一(不是两者)。
只需在您的想象中追踪动作即可。用户第一次运行该应用程序时会发生什么?
var ud = UserDefaults.standard.bool(forKey: "UDisFirstVisit")
好吧,用户默认设置中从未有过任何条目。所以 ud
不是 true
,因为它不是 任何东西 — 它不存在!所以是false
。所以你的欢迎视图控制器永远不会出现。
把你的逻辑反过来就行了。首先询问键 "UserHasSeenWelcome"
是否为 false。如果是,显示欢迎 v.c。并将密钥设置为 true
.
我正在尝试检测这是否是用户的首次访问,如果是,则显示欢迎屏幕,但我似乎无法正常工作,而且我不确定自己做错了什么。我查看了此处的一些建议并遵循了它们,我认为我理解了这个概念,但我无法让它发挥作用。
即使我尝试清除模拟器中的所有内容和设置,我还是被直接发送到 ViewController。
知道我做错了什么吗?任何提示将不胜感激。
代码如下:
func didFinishLaunchingWithOptions 下的 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
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()
}
}
首次安装应用时,您的任何 UserDefaults 键都没有值。所以当你这样做时:
var ud = UserDefaults.standard.bool(forKey: "UDisFirstVisit")
在不存在的 UDisFirstVisit
键上,您将返回 false
。
来自 bool(forKey:)
的文档:
The Boolean value associated with the specified key. If the specified key doesn‘t exist, this method returns false.
你有两个选择。
- 颠倒你的逻辑。首次显示欢迎屏幕后,将
UDhasVisited
键设置为true
。启动时,如果是false
,显示欢迎屏幕。 将以下行添加到您的
didFinishLaunchingWithOptions
:UserDefaults.standard.register(defaults: [ "UDisFirstVisit": true ])
两者选其一(不是两者)。
只需在您的想象中追踪动作即可。用户第一次运行该应用程序时会发生什么?
var ud = UserDefaults.standard.bool(forKey: "UDisFirstVisit")
好吧,用户默认设置中从未有过任何条目。所以 ud
不是 true
,因为它不是 任何东西 — 它不存在!所以是false
。所以你的欢迎视图控制器永远不会出现。
把你的逻辑反过来就行了。首先询问键 "UserHasSeenWelcome"
是否为 false。如果是,显示欢迎 v.c。并将密钥设置为 true
.