我的意图是向我的应用添加一个教程,该教程应该每个用户仅显示一次。
到目前为止,我的方法是创建一个func
时调用的viewDidLoad
:
func checkInitialVc() {
firstTime = defaults.bool(forKey: "firstTime")
if firstTime {
let initialData = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.show(initialData, sender: initialData)
}
}
问题在于,即使我第一次打开应用程序,也没有任何反应。
firstTime
被声明为全局:
var firstTime: Bool = false
在要打开但没有打开的ViewController中,我得到了:
@IBAction func buttonStart(_ sender: UIButton) {
firstTime = false
defaults.set(firstTime, forKey: "firstTime")
performSegue(withIdentifier: "goToSecond", sender: self)
}
答案 0 :(得分:1)
另一种方法是更改从用户默认值检索的布尔语义,例如从firstTime
更改为tutorialShown
,因为如果键不存在,用户默认值将返回false
。
func checkInitialVc() {
tutorialShown = defaults.bool(forKey: "tutorialShown")
if !tutorialShown {
let initialData = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.show(initialData, sender: initialData)
}
}
答案 1 :(得分:0)
启动应用程序时,它将加载每个快速文件,包括布尔值。 因此,在这种情况下,需要采取的步骤是:
var firstTime: Bool = False // Everytime you startup -> false
class YourViewController: UIViewController {
override func viewDidload(){
checkInitialVc()
}
func checkInitialVc() {
firstTime = defaults.bool(forKey: "firstTime")
if firstTime { // is False so never enters brackets
let initialData = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.show(initialData, sender: initialData)
}
}
}
因此,只需尝试将全局Bool
设置为UserDefault,以便在加载应用程序时,它已经具有将在加载视图并按下按钮后使用按钮设置的值:>
var firstTime = UserDefaults.standard.bool(forKey: "firstTime")
class YourViewController: UIViewController {
override func viewDidload(){
checkInitialVc() //calls your function when view is available
}
func checkInitialVc() {
if !UserDefaults.standard.bool(forKey:"firstTime"){ // UserDefaults.standard.bool is by default false
let initialData = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.show(initialData, sender: initialData)
}
@IBAction func buttonStart(_ sender: UIButton) {
UserDefaults.standard.set(true, forKey: "firstTime")
/*
or
*/
performSegue(withIdentifier: "goToSecond", sender: self)
}
}
答案 2 :(得分:0)
使用全局错误。更改
func checkInitialVc() {
firstTime = defaults.bool(forKey: "firstTime")
if firstTime {
let initialData = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.show(initialData, sender: initialData)
}
}
收件人:
func checkInitialVc() {
UserDefaults.standard.register(defaults:["firstTime":true]) // <--
firstTime = UserDefaults.standard.bool(forKey: "firstTime")
if firstTime {
UserDefaults.standard.set(false, forKey: "firstTime") // <--
let initialData = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
self.show(initialData, sender: initialData)
}
}