Swift - Установить UserDefault, если еще не установлено - PullRequest
0 голосов
/ 20 апреля 2019

Мое намерение - показать мои InitialViewController только один раз для каждого пользователя.

Код внутри didFinishLaunchingWithOptions должен проверять при запуске, является ли значение ключа UserDefaults firstTime все еще истинным.
Если нет, он не должен показывать InitialViewController.Если это правда, и VC отображается, его кнопка (см. 2-й код ниже) должна установить firstTime в false, чтобы предотвратить отображение InitialViewController при следующем запуске приложения.

Я считаю, что выяснил проблему, а именно: defaults.set(true, forKey: "firstTime") внутри didFinishLaunchingWithOptions:
Каждый раз, когда приложение запускается, оно игнорирует тот факт, что ключ мог быть установлен на 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)
        }
    }

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Код, который вы отправили

        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
}
0 голосов
/ 20 апреля 2019

Ну, вы можете просто инвертировать свою логику и проверить, произошло ли начальное действие или нет, поэтому вам не нужно устанавливать значение при запуске приложения. Например:

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)
        }
}
...