Swift,Xcode-每次使用一次仅打开ViewController

时间:2019-04-19 18:22:19

标签: ios swift xcode

我的意图是向我的应用添加一个教程,该教程应该每个用户仅显示一次。

到目前为止,我的方法是创建一个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)

    }

3 个答案:

答案 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)
    }
}